字符串hash
https://blog.csdn.net/pengwill97/article/details/80879387
https://blog.csdn.net/chaiwenjun000/article/details/71079819
AC代码
#include <cmath> #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <algorithm> #include <stack> #include <queue> using namespace std; typedef unsigned long long ull; const int maxn=1e6+10; const int base=13331; //base,基数 ull power[maxn]; //存储b^n void init() { power[0]=1; //base^0=1 for(int i=1; i<maxn; i++) power[i]=power[i-1]*base; //对ull取模 } char s1[maxn],s2[maxn]; ull Hash[maxn]; //记录主串哈希值的数组 int main() { init(); int T; cin>>T; while(T--) { scanf("%s%s",s1+1,s2+1); //从第一位开始输入 int n=strlen(s1+1),m=strlen(s2+1); Hash[0]=0; //记录主串哈希值的数组 for(int i=1; i<=m; i++) //计算主串的滚动Hash值 Hash[i]=Hash[i-1]*base+(ull)(s2[i]-'A'+1); ull s=0; for(int i=1; i<=n; i++) //计算匹配串的Hash值 s=s*base+(ull)(s1[i]-'A'+1); int ans=0; for(int i=0; i<=m-n; i++) if(s==Hash[i+n]-Hash[i]*power[n]) ans++; printf("%d ",ans); } return 0; }