输入两个长度均不超过1000的字符串,求它们的最长公共子串的长度。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod=1000000007;
const LL p=10000019;
const LL maxn=1010; //字符串的最长长度
LL powP[maxn];
LL H1[maxn]={0},H2[maxn]={0};
vector<pair<int,int> > pr1,pr2; //存放子串hash值、子串长度
void init(int len)
{
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];
return ((H[j]-H[i-1]*powP[j-i+1])%mod+mod)%mod;
}
void calSubH(LL H[],int len,vector<pair<int,int> > &pr)
{
for(int i=0;i<len;i++)
{
for(int j=i;j<len;j++)
{