Panda一个字符串是否是另一个字符串的子串
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,tt=4567;
long long hash[10005],h,p[10005];
char s1[10005];
char s2[10005];
int H(int l,int r){
return (hash[r]-(hash[l-1]*p[r-l+1])%mod+mod)%mod;
}
int main(){
scanf("%s",s1+1);
scanf("%s",s2+1);
int l1=strlen(s1+1);
int l2=strlen(s2+1);
for(int i=1;i<=l1;i++) h=(h*tt+s1[i])%mod;
hash[1]=s2[1];p[1]=tt;
for(int i=2;i<=l2;i++) hash[i]=(hash[i-1]*tt+s2[i])%mod,p[i]=(p[i-1]*tt)%mod;
for(int i=1;i+l1-1<=l2;i++){
if(h==H(i,i+l1-1)){
printf("yes");
return 0;
}
}
printf("no");
return 0;
}
/*
prprprprprpprprprprppr
rpprprprprprprprprprpprprprprprpprpr
*/