#include<iostream>
#include<string>
#include<vector>
using namespace std;
string str1, str2;
typedef long long ll;
const ll maxn = 1000;
const ll MOD = 1000000007;
const ll P = 10000019;
vector<pair<int, int>> pr1, pr2;
ll H1[maxn], H2[maxn];
ll powp[maxn];
void init(int len)
{ // 为了得到powp数组,省去后面操作的时间
powp[0] = 1;
for(int i = 1; i <= len; i++)
{
powp[i] = (powp[i-1] * P)%MOD;
}
}
void calH(ll H[], string str)
{
//计算每个字符串的哈希值
H[0] = str[0];
for(int i = 1; i < str.length(); i++)
{
H[i] = (H[i-1] * P + str[i]) % MOD;
}
}
int calsinglesubH(ll H[], int i, int j)
{
if(i == 0) return H[j];
else return ((H[j] - H[i-1]*powp[j-i+1]) % MOD + MOD) % MOD;
}
void calsubH(ll H[], int len, vector<pair<int, int>> &pr)
{ //计算每个字符串单个子串的哈希值,并用vector存储
for(int i = 0; i < len; i++)
{
for(int j = 0; j < len; j++)
{
int hashvalue = calsinglesubH(H, i, j);
pr.push_back(make_pair(hashvalue, j-i+1));
}
}
}
int getmax()
{ //计算两个字符串最长相同子串的长度
int ans = 0;
for(int i = 0; i < pr1.size(); i++)
{
for(int j = 0; j < pr2.size(); j++)
{
if(pr1[i].first == pr2[j].first)
{
ans = max(ans, pr1[i].second);
}
}
}
return ans;
}
int main()
{
getline(cin, str1);
getline(cin, str2);
init(max(str1.length(), str2.length()));
calH(H1, str1);
calH(H2, str2);
calsubH(H1, str1.length(), pr1);
calsubH(H2, str2.length(), pr2);
printf("ans = %d", getmax());
return 0;
}
测试用例:
ILOVEYOU
YOUDONTLOVEME
运行结果:
ans = 4
具体分析步骤有空再补,代码先看着