题目大意:
给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。
例子:
abcabc 已经循环2次,添加数为0
abcac 没有循环2次,添加字符abcac。数目为5.
abcabcab 已经循环过2次,但第三次不完整,需要添加数为1
算法分析:利用kmp的next数组的性质,我们先得到next数组,字符串长度为len,如果next[len] == 0说明这个字符串没有相等的前后缀,因此直接加上一个串长才能得到一个为2的周期,否则令tmp = len - next[len],这里tmp求得的就是一个周期的串长,如果len % tmp == 0说明总串长是一个周期串长的整数倍,则原串必已具有周期,若len % tmp != 0,则我们直接用tmp - len % tmp就是要添加的数量,相当于加上第二个周期内不足一个周期串长的长度。
例如:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN= 100010;
char s1[MAXN];
int next[MAXN];
void get_nextval(char s[])//求next数组
{
int i,j;
i = -1;
j = 0;
next[0] = -1;
int len = strlen(s);
while(j<len)
{
if(i == -1 || s[i] == s[j])
{
j++; i++;
next[j] = i;
}
else
i = next[i];
}
}
int main()
{
int len,temp;
int ans=0;
cin>>s1;
len=strlen(s1);
get_nextval(s1);//获得s1的next数组
temp=len-next[len];//字符串中一个循环的长度
if(next[len]==0)
ans=len;//就是字符串的长度
else
{
if(len%temp==0)
ans=0;
else
ans=temp-len%temp;
}
cout<<ans<<endl;
return 0;
}