bzoj1335Radio Transmission

Posted ywjblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj1335Radio 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

 














以上是关于bzoj1335Radio Transmission的主要内容,如果未能解决你的问题,请参考以下文章

[bzoj 1355][Baltic2009]Radio Transmission

Bzoj 1355---Radio Transmission(KMP)

bzoj 1355: [Baltic2009]Radio Transmissionkmp

BZOJ-1355: [Baltic2009]Radio Transmission (傻逼KMP)

BZOJ1355: [Baltic2009]Radio Transmission

[bzoj1355][Baltic2009]Radio Transmission_KMP