1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
| # include <bits/stdc++.h> typedef long long int LL; using namespace std;
# define abs(x) (((x)>0)?(x):-(x))
const int N = 1e5+10; const int MOD = 1e9+7;
int sum; LL read(){ LL x=0;char ch=getchar(); while('0'>ch||ch>'9') ch=getchar(); while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';sum++;ch=getchar();} return x; } /******************************************/
int n,m; int a[N][3],b[N][3],c[N<<1],d[N<<1],lc,ld;
void dfs1(int rt){ c[lc++]=a[rt][0];//printf("%d ",a[rt][0]); if(rt==0) return; dfs1(a[rt][1]); dfs1(a[rt][2]); }
void dfs2(int rt){ d[ld++]=b[rt][0];//printf("%d ",b[rt][0]); if(rt==0) return; dfs2(b[rt][1]); dfs2(b[rt][2]); } int Next[N<<1];//Next[i] 表示从[0~i]中最长公共前缀的长. void get_next(int *s,int len){ for(int i=0,j=-1;i<=len;++i,++j){ Next[i]=j; while(j>=0&&s[i]!=s[j]) j = Next[j]; } // for(int i=0;i<=len;i++) printf("%d%c",Next[i],(i==len)?'\n':' '); } //在串s上找sz int KMP (int *s,int len,int *sz,int l){ int i=0,j=0,cnt=0; while(i<len/*&&j<l*/){ if(s[i]==sz[j]) i++,j++; else{ if(0==j) i++; else j=Next[j]; } if(j==l) cnt++; } // return (j==l)?(i-l+1):-1; //找第一次出现的位置 return cnt; //找出现的个数 } bool visa[N],visb[N]; int main(){ while(~scanf("%d%d",&n,&m)){ lc=ld=0; for(int i=1;i<=n;i++) a[i][0]=read(),a[i][1]=read(),a[i][2]=read(),visa[a[i][1]]=visa[a[i][2]]=1; for(int i=1;i<=m;i++) b[i][0]=read(),b[i][1]=read(),b[i][2]=read(),visb[b[i][1]]=visb[b[i][2]]=1; for(int i=1;i<=n;i++) if(visa[i]==0){dfs1(i);break;}//puts(""); for(int i=1;i<=m;i++) if(visb[i]==0){dfs2(i);break;}//puts("");
get_next(d,ld); printf("%d\n",KMP(c,lc,d,ld)); for(int i=1;i<=n;i++) visa[i]=0; for(int i=1;i<=m;i++) visb[i]=0; } return 0; }
/*************************************************** User name: tabris Result: Accepted Take time: 872ms Take Memory: 596KB Submit time: 2017-06-05 00:39:32 ****************************************************/
# include <bits/stdc++.h> typedef unsigned long long int LL; using namespace std;
# define abs(x) (((x)>0)?(x):-(x))
const int N = 1e5+10; const int MOD = 1e9+7;
int sum; LL read(){ LL x=0;char ch=getchar(); while('0'>ch||ch>'9') ch=getchar(); while('0'<=ch&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';sum++;ch=getchar();} return x; } /******************************************/
int n,m,ans,lc,ld; int a[N][3],b[N][3];//,lb[N],rb[N]; LL c[N<<1],x,h,tota,totb;
void dfs1(int rt){ ++lc; c[lc]=a[rt][0]*x;x*=h; if(rt==0) return; dfs1(a[rt][1]); dfs1(a[rt][2]); }
void dfs2(int rt){ ++ld; totb+=b[rt][0]*x;x*=h; if(rt==0) return; dfs2(b[rt][1]); dfs2(b[rt][2]); }
bool visa[N],visb[N]; int main(){ a[0][0]=b[0][0]=101;h=27;c[0]=0; while(~scanf("%d%d",&n,&m)){ lc=ld=0;ans=0;tota=totb=0; for(int i=1;i<=n;i++) a[i][0]=read(),a[i][1]=read(),a[i][2]=read(),visa[a[i][1]]=visa[a[i][2]]=1; for(int i=1;i<=m;i++) b[i][0]=read(),b[i][1]=read(),b[i][2]=read(),visb[b[i][1]]=visb[b[i][2]]=1; x=1;for(int i=1;i<=n;i++) if(visa[i]==0){dfs1(i);break;}//puts(""); x=1;for(int i=1;i<=m;i++) if(visb[i]==0){dfs2(i);break;}//puts("");
for(int i=1;i<ld;i++) tota+=c[i]; for(int i=ld;i<=lc;i++){ tota-=c[i-ld],tota+=c[i]; if(tota==totb) ans++; totb*=h; }
printf("%d\n",ans); for(int i=1;i<=n;i++) visa[i]=0; for(int i=1;i<=m;i++) visb[i]=0; } return 0; }
/*************************************************** User name: tabris Result: Accepted Take time: 884ms Take Memory: 2244KB Submit time: 2017-06-05 01:34:54 ****************************************************/
|