call 大佬 help7——kmp 补齐 循环节
http://acm.hdu.edu.cn/showproblem.php?pid=3746
用kmp算法,那么
但是也等于上面的是正确的
也等于下面是错误的
why?
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,t; char s[1000001]; int f[1000010]; void getnext() { for(int i=1;i<n;i++) { int j=f[i]; while(j&&s[i]!=s[j]) j=f[j]; f[i+1]= s[i]==s[j] ? j+1:0; } } int main() { scanf("%d",&t); while(t--) { scanf("%s",s); n=strlen(s); memset(f,0,sizeof(f)); getnext(); if(f[n]==0) printf("%d\n",n); else if(n%(n-f[n])==0) printf("0\n"); else { int a=n-f[n]; printf("%d\n",a-n%a); } } }
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,t; char s[1000001]; int f[1000010]; void getnext() { for(int i=1;i<n;i++) { int j=f[i]; while(j&&s[i]!=s[j]) j=f[j]; f[i+1]= s[i]==s[j] ? j+1:0; } } int main() { scanf("%d",&t); while(t--) { scanf("%s",s); n=strlen(s); memset(f,0,sizeof(f)); getnext(); if(f[n]==0) printf("%d\n",n); else if(n%(n-f[n])==0) printf("0\n"); else { if(f[n]<=n/2) printf("%d\n",n-f[n]*2); else printf("%d\n",2*n-3*f[n]); } } }