这个有点意思,要理解失配数组
题意是要计算出需要构造成循环节相连的最小个数
利用失配构造函数求出单个循环节,然后计算出需要的加上的珠子个数
1 #include <cstdio> 2 #include <algorithm> 3 #include <cstring> 4 #include <ctype.h> 5 #include <cstdlib> 6 #include <stack> 7 #include <set> 8 #include <map> 9 #include <queue> 10 #include <string> 11 #include <cmath> 12 13 using namespace std; 14 15 int T; 16 char P[100100]; 17 18 int solve(char *P) 19 { 20 int m = (int)strlen(P); 21 int f[m+10]; 22 memset(f,-1,sizeof f); 23 int i = 0,j = -1; 24 while(i != m) 25 { 26 if(j == -1||P[i] == P[j]) 27 f[++i] = ++j; 28 else 29 j = f[j]; 30 } 31 int k = m-f[m]; 32 return (k != m && f[m]%k==0) ? 0 : k-f[m]%k; 33 } 34 35 int main() 36 { 37 scanf("%d",&T); 38 while(T--) 39 { 40 scanf("%s",P); 41 printf("%d ",solve(P)); 42 } 43 }