这道题是不能用 KMP 来做吗?我写完以后样例是过了,但是 WA 完了。
#include<bits/stdc++.h>
using namespace std;
int fail[100010];
char s2[100010];
int ans;
int main()
{
int T;
cin>>T;
while(T--)
{
int m;
scanf("%d",&m);
scanf("%s",s2+1);
memset(fail,0,sizeof fail);
for(int i=2,t=0;i<=m;i++)
{
while(t&&s2[i]!=s2[1+t]&&s2[1+t]!='?'&&s2[i]!='?')
{
t=fail[t];
}
if(s2[i]==s2[1+t]||s2[i]=='?'||s2[1+t]=='?')
{
t++;
}
fail[i]=t;
}
int maxn=0;
for(int i=1;i<=m;i++)
{
if(fail[i]*2<=m)
maxn=max(maxn,fail[i]);
}
cout<<maxn<<"\n";
}
return 0;
}
求 dalao 指点