直接说结论吧,KMP算法的前提是预处理一个next数组
,一个字符串长度为len,那么这个字符串的最小循环节就是len-nxt[len]。
因此有:
- 判断一个字符串是否完全循环可以用 (len%(len-nxt[len]))==0,并且nxt[len]!=0
- 该题中询问的是在末尾补上几个字符串可以使字符串完全循环,那么就用最小循环节(len-nxt[len])- 最末尾多余的字符个数(nxt[len]%最小循环节)即可
AC代码:
/*
* @Author: hesorchen
* @Date: 2020-07-03 17:05:01
* @LastEditTime: 2020-07-12 17:06:22
* @Description: https://hesorchen.github.io/
*/
#include <bits/stdc++.h>
using namespace std;
#define IOS \
ios::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define FRE \
{ \
freopen("in.txt", "r", stdin); \
freopen("out.txt", "w", stdout); \
}
#define ll long long
ll nxt[100010];
char a[100010];
void get_nxt()
{
ll len = strlen(a);
ll j = 0, k = -1;
nxt[0] = -1;
while (j < len)
{
if (k == -1 || a[j] == a[k])
nxt[++j] = ++k;
else
k = nxt[k];
}
}
int main()
{
IOS;
ll t;
cin >> t;
while (t--)
{
cin >> a;
get_nxt();
if (strlen(a) % (strlen(a) - nxt[strlen(a)]) == 0 && nxt[strlen(a)] != 0)
cout << 0 << endl;
else
cout << strlen(a) - nxt[strlen(a)] - (nxt[strlen(a)] % (strlen(a) - nxt[strlen(a)])) << endl;
}
return 0;
}