HDU-3746-KMP理解失配

这个有点意思,要理解失配数组

题意是要计算出需要构造成循环节相连的最小个数

利用失配构造函数求出单个循环节,然后计算出需要的加上的珠子个数

 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 }
原文地址:https://www.cnblogs.com/helica/p/4730470.html