哈希也是有技巧的。不然很容易错。
匹配串范围是1e6的,所以普通hash错误概率也是很大的
所以就要利用匹配的特性(长度与匹配串一一对应)来hash,这样错误概率会小,相当于hash挂链吧。
一开始写的每个前缀hash存位置。这样一个hash里就有1e6个值。
码:
#include #include #include #include #include #define P 2147483647 #define ll long long #define D(x) cout<v[N]; ll qian[N],hou[N]; int sz[N],fu[N],f[N],g[N],vf[N],vg[N],i,j,n,m,ans,tot,rt,now,T,a,b; ll ci[N],lin; char ch[N],S[N]; bool vis[N]; void dfs(int o,int fa) { int i,nd; sz[o]=1;fu[o]=fa; for(i=0;i'Z')scanf("%c",&ch[i]); } for(i=1;i'Z')scanf("%c",&S[i]); } lin=0; for(i=0;i<=n;i++) { lin=(lin*27+1ll*(S[(i%m)+1]-'A'+1))%P; qian[i]=lin; } lin=0; for(i=0;i<=n;i++) { lin=(lin*27+1ll*(S[(m-i%m-1)+1]-'A'+1))%P; hou[i]=lin; } dfs(1,0); tot=n; zzx(1,0); dfs(rt,0); work(rt); printf("%d\n",ans); } }