搞笑的题
这题其实类似于上面的一个也和前缀有关的题
就是不断地套next
但是刚开始我理解错题义了
直接开始二分
更离谱的是我二分还写错了,没有写r=mid-1这一句
然后我ac了真的是离谱
#include<cstdio>
#include<cstring>
using namespace std;
const int max_n = 1e6+100;
int n;
int net[max_n];
void getnext(char p[]){
net[0]=-1;
for (int i=0,j=-1;i<n;){
if (j==-1||p[i]==p[j])net[++i]=++j;
else j = net[j];
}
}
bool kmp(int len,char p[]){
int l = len;int r = n-len-1;
for (int i=l,j=0;i<=r;){
if (j==-1||p[i]==p[j]){++i;++j;}
else j=net[j];
if (j==len)return true;
}return false;
}
char s[max_n];
int main(){
int T;scanf("%d",&T);
while (T--){
scanf("%s",s);
n = strlen(s);
getnext(s);
int len = net[n];
while (len){
if (len*3<=n&&kmp(len,s))break;
len=net[len];
}printf("%d\n",len);
}
}但是这个复杂度会是多少呢?
我有点迷茫。

京公网安备 11010502036488号