题意:找出一个字符串前缀与后缀相同,并且中间也有相同的一串的最大长度,要求这三段不重叠。
思路:KMP
代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<map>
#include<set>
#include<list>
#include<stack>
#include<algorithm>
#include<queue>
#include<vector>
#include<time.h>
#include<iomanip>
#include<assert.h>
using namespace std;
char s[1000005];
int nxt[1000005];
int len;
set<int> st;
void getnxt()
{
memset(nxt,-1,sizeof(nxt));
nxt[0] = -1; int j = -1;
for(int i = 0; i < len;){
if(j == -1||s[i] == s[j])nxt[++i] = ++j;
else j = nxt[j];
}
}
void getback()
{
int p = nxt[len-1];
while(p>=0){
if(s[len-1] == s[p]){
st.insert(p+1);
}
p = nxt[p];
}
}
void solve()
{
int ans = 0;
for(int i = len-2;i>=0;--i){
int p = nxt[i];
while(p>=0){
if(s[i] == s[p] && st.find(p+1)!=st.end()){
if(len - 1 -p > i && p < i-p){
ans = max(ans,p+1);
}
}
p = nxt[p];
}
}
printf("%d\n",ans);
}
int main()
{
// freopen("data.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s);
st.clear();
len = strlen(s);
getnxt();
getback();
solve();
}
return 0;
}