【bzoj1335】Radio Transmission

给你一个字符串,它是由某个字符串不断自我连接形成的。
但是这个字符串是不确定的,现在只想知道它的最短长度是多少.

因为这个字符串是不断自匹配形成的我们可以很容易的想到,除了第一个字符串外,从第二个字符串开始,根据这样一个过程:
cabcabca
i=1 0 j=1
i=2 0
i=3 0
i=4 1
i=5 -> j=4 -> 2
i=6 3
i=7 4
i=8 -> j=7 -> 5
也就是说,除了第一个字符串外
剩下的都可以通过next数组的辅助平移是匹配进行下去
这样就是说在next数组中,除了第一个字符串外,剩下的存储在next数组中的数是从1开始逐个递增的,这样就是说,最后我们用组合字符串长度n减去next[n]就能得到最小循环元的长度

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1000086;
 4 int n;
 5 char a[maxn];
 6 int Next[maxn];
 7 
 8 inline int read() {
 9     int x = 0, y = 1;
10     char ch = getchar();
11     while(!isdigit(ch)) {
12         if(ch == '-') y = -1;
13         ch = getchar();
14     }
15     while(isdigit(ch)) {
16         x = (x << 1) + (x << 3) + ch - '0';
17         ch = getchar();
18     }
19     return x * y;
20 }
21 
22 int main() {
23     n = read();
24     cin >> a + 1;
25     Next[1] = 0;
26     for(int i = 2, j = 0; i <= n; ++i) {
27         while(j > 0 && a[i] != a[j + 1]) j = Next[j];
28         if(a[i] == a[j + 1]) j++;
29         Next[i] = j;
30     }
31     cout << n - Next[n] << '
';
32     return 0;
33 } 
View Code
原文地址:https://www.cnblogs.com/ywjblog/p/9275206.html