题意:输出最长的前缀, 前缀要满足在原串中至少匹配3次。
思路:很容易想到前缀E和后缀E可以用next数组求出,然后在判断中间的E是否存在,具体做法是:next[len]=i,在[2 * i ,len - i](因为不能重合)内找是否有next[j]=i,存在则i就为答案,但是不存在的话不能继续i--找应该令i=next[i],用到了next数组border的性质。很容易想到失配时的跳转,因为中间那段肯定也不满足寻找得到三个。
#include<stdio.h> #include<math.h> #include<string.h> #include<map> #include<algorithm> #define N 200060 #define ll long long using namespace std; const int maxn=2000110; char str[maxn]; int nextt[maxn]; void getnext(int len) { int i=0,j=-1; nextt[i]=j; while(i<len) { if(j==-1||str[i]==str[j]) { i++;j++;nextt[i]=j; } else j=nextt[j]; } } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s",str); int n=strlen(str); getnext(n); int ans=0; for(int i=nextt[n];i;i=nextt[i]) { for(int j=i*2;j<=n-i;j++) { if(nextt[j]==i) { ans=i; break; } } if(ans) { break; } } printf("%d ",ans); } }