题意:
求最少添加多少个字符使字符串变成由 n (n>=2) 个循环节组成的字符串。
思路:
这个题需要用到一些与 nxt 数组有关的公式
假设字符串长度为 len (代码中为 n )
设最小循环节的长度为 m :m = len - nxt[len]
设所需补全的字符数为 x :x = m-len%m = m-(len-m)%m = m-nxt[len]%m 。
字符串的循环条件是 : len%(len-nxt[len])==0&&nxt[len]!=0
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int nxt[maxn];
char s[maxn];
void getnext( )
{
int plen = strlen(s);
nxt[0] = -1;
int k = -1;
int j = 0;
while(j<plen)
{
if(k==-1 || s[j]==s[k])
{
k++;
j++;
nxt[j] = k;
}
else
k = nxt[k];
}
}
int main()
{
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%s",s);
int n = strlen(s);
getnext( );
int m = n-nxt[n];//循环节长度
if(n%m==0 && n/m>1)
printf("0\n");
else
printf("%d\n",m-n%m);
//printf("%d\n",m-nxt[n]%m);
}
return 0;
}