题目描述:让你在一个串中找 一个子串前缀后缀和中间都出现了该子串。
分析:显然是一道KMP的题,不过这次又忽略了next会把前面短的盖住 而wa了一发;
ac代码:
#include<bits/stdc++.h>
using namespace std;
int next1[1000003];
int vis[1000003];
int main(){
string s;
cin>>s;
memset(vis,0,sizeof(vis));
next1[0]=-1;
next1[1]=0;
int i=1,j=0,len=s.length();
while(i<len){
if(j==-1||s[i]==s[j]){next1[++i]=++j;vis[j]++;}
else j=next1[j];
}
j=next1[len];
while(j>0){
if(vis[j]>1){cout<<s.substr(0,j)<<endl;return 0;}
else j=next1[j],vis[j]++;
}
cout<<"Just a legend"<<endl;
}

京公网安备 11010502036488号