题意
给你字符串A,B问你A中的前缀字符是B的后缀字符串的最大长度
思路
由于数据比较小,可以用字符串hash,把所有的hash值求出来,然后遍历所有的A字符串的前缀判断B的后缀字符串两者的hash值是不是相同就可以
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN=5e5;
char str1[MAXN],str2[MAXN];
typedef unsigned long long ull;
const int seed=13331;
ull xp[MAXN],hash_1[MAXN],hash_2[MAXN];
void init()
{
xp[0]=1;
for(int i=1;i<MAXN;i++)
xp[i]=xp[i-1]*seed;
}
int make_hash(char str[],ull hash[])
{
int len=strlen(str);
hash[len]=0;
for(int i=len-1;i>=0;i--)
hash[i]=hash[i+1]*seed+str[i]-'a'+1;
return len;
}
ull get_hash(int i,int l,ull hash[])
{
return hash[i]-hash[i+l]*xp[l];
}
int main()
{
init();
while(scanf("%s%s",str1,str2)!=EOF)
{
int len1=make_hash(str1,hash_1);
int len2=make_hash(str2,hash_2);
int ans=0;
for(int i=1;i<=len1;i++)
{
if(get_hash(0,i,hash_1)==get_hash(len2-i,i,hash_2))
{
ans=i;
}
}
if(!ans) puts("0");
else
{
for(int i=0;i<ans;i++)
printf("%c",str1[i]);
printf(" %d\n",ans);
}
}
return 0;
}