后缀数组求字符串最长重复子串
求一个字符串的最长重复子串:
1.求字符串s的后缀数组suffix
2.suffix排序
3.求最长公共前缀
#include<iostream> #include<fstream> #include<string> #include<vector> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<unordered_map> #include<unordered_set> #include<algorithm> using namespace std; int comlen(string s1,string s2) { //计算两个字符串的最长公共前缀 int i=0,j=0; int len=0; while(i<s1.size()&&j<s2.size()) { if(s1[i]==s2[i]) { i++;j++; len++; } else return len; } return len; } string FindRepeatSubstr(string s) { vector<string> suffix; //后缀数组 string ans; int len=0; int maxlen=0; int i; for(i=0;i<s.size();i++) { suffix.push_back(s.substr(i,s.size()-i)); } sort(suffix.begin(),suffix.end()); //给后缀数组排序 for(i=0;i<suffix.size()-1;i++) //计算相邻两个后缀数组的最长公共前缀 { len=comlen(suffix[i],suffix[i+1]); if(len>maxlen) { maxlen=len; ans=suffix[i].substr(0,maxlen); } } return ans; } int main() { string str; while(cin>>str) { if(str=="") cout<<""<<endl; cout<<FindRepeatSubstr(str)<<endl; } return 0; }