题目链接:[kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher D - Cyclic Nacklace
题意
给一字符串,求在其尾部添加最少多少个字符,可以使其内部循环两次以上。
例:ababa,需后面添加b即可 ababc需后面添加ababc。
思路
kmp求出字符串前后缀重复数next[n-1],则尾部不能循环的部分长度为L=n-next[n-1],需要补充的长度为L - n%L;
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
char a[100009];
int p[100009];
void init(int m)
{
memset(p, 0, sizeof(p));
for(int i=1, k=0; i<m; i++)
{
while(k>0 && a[i]!=a[k]) k = p[k-1];
if(a[i] == a[k]) k++;
p[i] = k;
}
}
int solve(int n)
{
init(n);
int l = n-p[n-1];
if(l != n && n%l == 0)
return 0;
return l - n%l;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%s", a);
printf("%d\n", solve(strlen(a)));
}
return 0;
}