字符串哈希
#include<bits/stdc++.h> using namespace std; #define far(i,t,n) for(int i=t;i<n;++i) typedef long long ll; typedef unsigned long long ull; char t[1000010]; char w[10010]; const int p=12582917; ull po[10010]; ull Hash[1000010]; void initPo()//预处理p^(r-l+1) { po[0]=1; po[1]=p; far(i,2,10002) po[i]=po[i-1]*p; } ull getSingleHash(char c[],int n) { Hash[0]=c[0]-'A'; far(i,1,n) { Hash[i]=Hash[i-1]*p; Hash[i]+=c[i]-'A'; } } ull getHash(int l,int r) { if(l==0) return Hash[r]; return Hash[r]-Hash[l-1]*po[r-l+1]; } int main() { int Kase; cin>>Kase; initPo(); while(Kase--) { scanf("%s%s",w,t); int lw=strlen(w),lt=strlen(t); ull x=w[0]-'A'; far(i,1,lw) x=x*p+(w[i]-'A'); getSingleHash(t,lt); int ans=0; for(int i=0;i<=lt-lw;++i) { // cout<<i<<" "<<getHash(i,i+lw)<<endl; if(x==getHash(i,i+lw-1)) ++ans; } printf("%d\n",ans); } return 0; }