题目描述:让你在一个串中找 一个子串前缀后缀和中间都出现了该子串。
分析:显然是一道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; }