牛客-2018多校算法第五场C-KMP
在原来的字符串中前缀与后缀相同,且原来的中间还含有这个子串;
这里加的num【】数组真是太厉害了,可以直接用来判断中间是否有子串;
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cstdio> using namespace std; const int maxn =1e6+7; int nt[maxn],len; int num[maxn]; string str; void get_nt() { int i=0,k=-1; nt[0]=-1; while(i < len) { if( k==-1 || str[i]==str[k]) nt[++i]=++k; else k=nt[k]; } } int main(){ int find = 1; cin>>str; len =str.length(); get_nt(); for(int i=1;i<len;i++) { num[nt[i]]++; cout<<nt[i]<<endl; } int i =nt[len]; //cout<<len<<endl; cout<<i<<endl; while(i) { if(num[i]) { for(int k=0;k<i;k++) cout<<str[k]; cout<<endl; find = 0; break; } i=nt[i]; } if(find)cout<<"Just a legend"<<endl; return 0; }
skr