题目连接
题意
给你俩串,求第一个串在第二个串中出现几次。
思路
kmp板子题,才知道hash这操作,试试水。
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const ull seed = 163;
ull h[1000005], p[1000005];
void init(string _s)
{
p[0] = 1;
h[0] = 0;
int len = _s.length();
for(int i = 1; i <= len; ++i)
{
p[i] = p[i-1]*seed;
h[i] = h[i-1]*seed+_s[i-1];
}
}
ull gethash(int l, int r)
{
return h[r] - h[l-1]*p[r-l+1];
}
string a, b;
int main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while(t--)
{
cin >> a >> b;
init(a);
int ans = 0, len = a.length();
ull tmp = gethash(1,len);
init(b);
for(int i = b.length()-len+1; i; --i)
if(tmp == gethash(i,i+len-1)) ++ans;
cout << ans << endl;
}
return 0;
}