标签:
题目:

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