标签:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 6 const int MS=100005; 7 char str1[MS],str2[MS]; 8 int next[MS]; 9 void get_next(char *s,int *next) 10 { 11 int i=1,j=0; 12 next[1]=0; 13 int len=strlen(s); 14 while(i<len) 15 { 16 if(j==0||s[i-1]==s[j-1]) 17 { 18 i++; 19 j++; 20 next[i]=j; //求最大循环次数 就用这个 21 /* 22 if(s[i-1]==s[j-1]) 23 next[i]=next[j]; 24 else 25 next[i]=j; 26 */ 27 } 28 else 29 j=next[j]; 30 } 31 } 32 33 int KMP(char *s,char *t) 34 { 35 int i=1,j=1; 36 int len1=strlen(s); 37 int len2=strlen(t); 38 get_next(t,next); 39 while(i<=len1&&j<=len2) 40 { 41 if(j==0||s[i-1]==s[j-1]) 42 { 43 i++; 44 j++; 45 } 46 else 47 j=next[j]; 48 } 49 if(j>len2) 50 return i-len2-1; 51 return -1; 52 } 53 54 int main() 55 { 56 int T; 57 scanf("%d",&T); 58 while(T--) 59 { 60 scanf("%s",str2); 61 get_next(str2,next); 62 int len=strlen(str2); 63 if(str2[len-1]!=str2[next[len]-1]) 64 next[len]=next[next[len]]; 65 int ans=len-next[len]; 66 if(ans!=len&&len%ans==0) 67 printf("0\n"); 68 else 69 printf("%d\n",ans-len%ans); 70 } 71 return 0; 72 }
标签:
原文地址:http://www.cnblogs.com/767355675hutaishi/p/4303492.html