小明接到一个破解报文的任务:该报文是一串文本,破解出的密文应是在报文串中出现次数大于1的所有子串中的最长者。规定报文本身不能称为自己的子串。请编写效率尽可能高的程序帮小明完成这个棘手的任务。
输入格式:
输入为一个字符串,表示报文,包含不超过10000个字母。
输出格式:
输出为一个整数,表示破解出的密文串的长度。
输入样例1:
xabceabcf
输出样例1:
3
输入样例2:
xyabcabcayx
输出样例2:
4
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
string s;
unordered_map<char , int>mp;
unordered_map<char , vector<int>>idx;
int res = 0;
int main()
{
getline(cin , s);
int n = s.size();
for(int i = 0;i < n;i ++)
{
if(!mp[s[i]])
{
mp[s[i]] ++;
idx[s[i]].push_back(i);
}
else
{
mp[s[i]] ++;
for(int h = 0;h < idx[s[i]].size();h ++)
{
int t = idx[s[i]][h];
int j = i;
while(j < n && t < n && s[j] == s[t]) t ++ , j ++;
res = max(res , j - i);
}
idx[s[i]].push_back(i);
i = i + res - 1;
}
}
cout << res << endl;
return 0;
}