标签:
题目:
3 aaa abca abcde
0 2 5
题目大意:
对于一个给定的字符串,需要添加多少个字符才能使该字符串的循环节的个数>=2。
题目分析:
KMP。简单题。
这道题需要记住以下几点:
1、len-next[len] : 该字符串的最小循环节的长度
2、如果len%(len-next[len]) == 0 ,表明该字符串由循环节组成,那么循环节的个数是len/(len-next[len])。
代码如下:
/* * hdu3746.cpp * * Created on: 2015年4月18日 * Author: Administrator */ #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; const int maxn = 100001; int m;//目标串的长度 char pattern[maxn];//模式串 int nnext[maxn];//next数组.直接起next可能会跟系统中预定的重名. /*O(m)的时间求next数组*/ void get_next() { m = strlen(pattern); nnext[0] = nnext[1] = 0; for (int i = 1; i < m; i++) { int j = nnext[i]; while (j && pattern[i] != pattern[j]) j = nnext[j]; nnext[i + 1] = pattern[i] == pattern[j] ? j + 1 : 0; } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%s",pattern); get_next(); int len = strlen(pattern);//计算模式串的长度 /** * 如果该字符串已经是由多个循环节组成. * len%(len-nnext[len]) == 0 : 该字符串由循环节组成 * (len != len-nnext[len]) :字符串的长度不等于循环节的长度 * * ----->该字符串本身已经由多个循环节组成 */ if(len%(len-nnext[len]) == 0 && (len != len-nnext[len]) ){ printf("0\n");//那这时候需要添加的字符的数量是0 }else{ /** * len-nnext[len] : 循环节的长度 * len%(len-nnext[len] : 字符串中不是循环节的部分的长度 */ int ans = (len-nnext[len]) - (len%(len-nnext[len]));//计算还需要添加的字符的数量 printf("%d\n",ans); } } return 0; }
(KMP 1.4)hdu 3746 Cyclic Nacklace(使用next数组来求循环节的长度——求一个字符串需要添加多少个字符才能使该字符串的循环节的个数>=2)
标签:
原文地址:http://blog.csdn.net/hjd_love_zzt/article/details/45114169