码迷,mamicode.com
首页 > 其他好文 > 详细

【bzoj1335】Radio Transmission

时间:2018-07-06 19:38:40      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:getchar   lap   none   数组   next数组   nbsp   iss   存储   smi   

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

因为这个字符串是不断自匹配形成的我们可以很容易的想到,除了第一个字符串外,从第二个字符串开始,根据这样一个过程:
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] << \n;
32     return 0;
33 } 
View Code

 

【bzoj1335】Radio Transmission

标签:getchar   lap   none   数组   next数组   nbsp   iss   存储   smi   

原文地址:https://www.cnblogs.com/ywjblog/p/9275206.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!