DS串应用—最长重复子串
Posted szu-ds-wys
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DS串应用—最长重复子串相关的知识,希望对你有一定的参考价值。
题目描述
求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。
输入
测试次数t
t个测试串
输出
对每个测试串,输出最长重复子串长度,若没有重复子串,输出-1.
样例输入
3 abcaefabcabc szu0123szu szuabcefg
样例输出
4 3 -1
提示
#include<iostream> #include<string> using namespace std; int *getnext(string p) { int j=0,k=-1; int *next=new int[p.size()]; next[0]=-1; while(j<(int)p.size()-1) { if(k==-1||p[j]==p[k]) { j++; k++; next[j]=k; } else k=next[k]; } return next; } int KMP(string s,string p) { int i=0,j=0; int *next=getnext(p); while(i<(int)s.size()&&j<(int)p.size()) { if(j==-1||s[i]==p[j]) { i++; j++; } else j=next[j]; } if(j==(int)p.size()) return i-j+1; return -1; } int Find(string s) { int L=s.size(); int Max=-1; for(int i=0;i<L;i++) { for(int j=i;j<L;j++) { string p=s.substr(i,j-1); string save=s; int firstindex=KMP(s,p); int slength=s.size(); int plength=p.size(); string S=s.substr(0,firstindex-1); string after=s.substr(firstindex-1+plength,slength); S+=after; if(KMP(S,p)!=-1) { int t=plength; if(t>Max) Max=t; } s=save; } } if(Max==0) return -1; return Max; } int main() { int T; cin>>T; while(T--) { string s; cin>>s; cout<<Find(s)<<endl; } return 0; }
以上是关于DS串应用—最长重复子串的主要内容,如果未能解决你的问题,请参考以下文章