题目大意
给定一个字符串,要求删除一个字符,要求每一个不重叠的子串是一样的!
解题思路
只要求出 n−1 的所有约数就可以,在 1e5 内的数约数不会超过128个,从小到达遍历每一个约数,然后进行判断,如果成功一次就退出循环,时间复杂度为 O(128n)
AC代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MX = 1e5+5;
char str[MX];
int A[MX];
int presolve(int n)
{
int len = 1;
for(int i=1;i<=n;i++)
if( !(n%i) ) A[len++] = i;
return len;
}
bool check(int len,int n)
{
int l=0,r=0;
int flag = 0;
while(l<n) {
if(str[l]==str[r]) {
l++;r++;
} else if(flag) {
flag++;
break;
} else {
flag = true;
l++;
}
if(r>=len) r = 0;
}
if(flag<=1) return true;
l=0,r = n-len,flag = 0;
while(l<(n-len)) {
if(str[l]==str[r]) {
l++;r++;
} else if(flag) return false;
else {
flag = true;
l++;
}
if(r>=n) r = n-len;
}
return true;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
scanf("%s",str);
int len = presolve(n-1);
int ans = 0;
for(int i=1;i<len;i++) {
if(check(A[i],n)) {
ans = A[i];
break;
}
}
printf("%d\n",(n-1)/ans);
}
return 0;
}