#include<bits/stdc++.h>
#define ll long long
#define PB push_back
#define endl '\n'
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define lowbit(x) (x & (-x))
#define rep(i, a, b) for(int i = a ; i <= b ; ++ i)
#define per(i, a, b) for(int i = b ; i >= a ; -- i)
#define clr(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = 2e6 + 10;
const ull mod = 233;
const int mo = 14937;
char s[maxn];
int cnt, head[maxn];
ull pre[maxn], p[maxn];
ull q(int l, int r){return pre[r] - pre[l-1]*p[r-l+1];}
struct node{
ull to; int next;
}edge[maxn];
void add(ull x){
int pos = x % mo;
edge[cnt].to = x;
edge[cnt].next = head[pos];
head[pos] = cnt ++;
}
bool found(ull x){
int pos = x % mo;
for(int i = head[pos] ; ~ i ; i = edge[i].next){
ull v = edge[i].to;
if(x == v) return true;
}
return false;
}
int main()
{
scanf("%s", s + 1); int n = strlen(s + 1);
int len = n;
p[0] = 1;
clr(head, -1);
for(int i = 1 ; i <= n ; ++ i) p[i] = p[i-1] * mod;
for(int i = 1 ; i <= n ; ++ i){
pre[i] = pre[i-1] * mod + (ull)s[i];
}
add(pre[n]);
for(int i = 1 ; i < n ; ++ i){
add(q(1, i) + p[i] * q(i+1,n));
}
int T;
cin >> T;
while(T --){
scanf("%s", s + 1); n = strlen(s + 1);
int ct = 0;
for(int i = 1 ; i <= n ; ++ i){
pre[i] = pre[i-1] * mod + (ull) s[i];
if(i >= len){
if(found(q(i-len+1,i))) ct ++;
}
}
cout << ct << endl;
}
return 0;
}
白兔的字符串(hash+模拟map)
最新推荐文章于 2024-07-24 16:53:06 发布