网站开发的国内外研究现状,内网网站怎么建设,网站栏目框架,新乡网站建设开发正题 题目大意
两个字符串A,BA,BA,B。可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串#xff0c;求kkk的最大值。 解题思路
先将AAA和BBB字符串hashhashhash#xff0c;然后枚举BBB作为子串的起始位置#xff0c;然后二分出不修改字符的第一个不相等处xxx…正题 题目大意
两个字符串A,BA,BA,B。可以修改AAA中的一个字符使得AAA中的1∼k1\sim k1∼k是BBB的子串求kkk的最大值。 解题思路
先将AAA和BBB字符串hashhashhash然后枚举BBB作为子串的起始位置然后二分出不修改字符的第一个不相等处xxx然后从x1x1x1个字符继续开始二分也就是表示跳过xxx这个字符。
时间复杂度O(nlogn)O(n\ log\ n)O(n log n) codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ull unsigned long long
using namespace std;
const int N51000,p233;
char a[N],b[N];
int n1,n2,maxs;
ull pow[N],hash1[N],hash2[N];
ull get_hash1(int l,int r)
{return hash1[r]-hash1[l-1]*pow[r-l1];}
ull get_hash2(int l,int r)
{return hash2[r]-hash2[l-1]*pow[r-l1];}
int main()
{scanf(%s,a1);n1strlen(a1);scanf(%s,b1);n2strlen(b1);pow[0]1;for(int i1;in1;i){pow[i]pow[i-1]*p;hash1[i]hash1[i-1]*pa[i]-a;}for(int i1;in2;i)hash2[i]hash2[i-1]*pb[i]-a;for(int i1;in2;i){int ans,l0,rmin(n1,n2-i1);while(lr){int mid(lr)/2;if(hash1[mid]get_hash2(i,imid-1)) lmid1;else rmid-1;}ansr1;lr1;rmin(n1,n2-i1);while(lr){int mid(lr)/2;if(get_hash1(ans1,mid)get_hash2(ians,imid-1)) lmid1;else rmid-1;}maxsmax(maxs,r);}printf(%d,maxs);
}