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); else if(n%(n-f[n])==0) printf("0 "); else { int a=n-f[n]; printf("%d ",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); else if(n%(n-f[n])==0) printf("0 "); else { if(f[n]<=n/2) printf("%d ",n-f[n]*2); else printf("%d ",2*n-3*f[n]); } } }