Pagini recente » Cod sursa (job #545987) | Cod sursa (job #2397186) | Cod sursa (job #677874) | Cod sursa (job #3131762) | Cod sursa (job #2450370)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int mod=(int)1e9+7;
int add(int a,int b)
{
a+=b;
if(a>=mod)
return a-mod;
if(a<0)
return a+mod;
return a;
}
int mul(int a,int b)
{
return a*(ll)b%mod;
}
int expow(int a,int b)
{
int r=1;
while(b)
{
if(b&1)
r=mul(r,a);
a=mul(a,a);
b/=2;
}
return r;
}
/**const int mod1=(int)1e9+7;
const int mod2=(int)1e9+9;
struct num
{
int a;
int b;
};
num add(num f,num s)
{
f.a+=s.a;
f.b+=s.b;
if(f.a<0) f.a+=mod1;
if(f.a>=mod1) f.a-=mod1;
if(f.b<0) f.b+=mod2;
if(f.b>=mod2) f.b-=mod2;
return f;
}
num mul(num f,num s)
{
return {f.a*(ll)s.a%mod1,f.b*(ll)s.b%mod2};
}
num expow(num a,int b)
{
num r={1,1};
while(b)
{
if(b&1)
r=mul(r,a);
a=mul(a,a);
b/=2;
}
return r;
}**/
mt19937 rng(228);
vector <int> test;
const int N=(int)4e5+7;
const int K=20;
int anc[N][K];
int n;
int val[N];
int suf[N];
int dep[N];
int pw[N];
int get(int i,int k)
{
for(int j=0;(1<<j)<=k;j++)
if(k&(1<<j))
i=anc[i][j];
return i;
}
int hsh[N];
map <int,vector <int>> u;
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
freopen("input","r",stdin);
pw[0]=1;
for(int i=1;i<N;i++)
pw[i]=mul(pw[i-1],26);
test.push_back((int)4e5);
while(test.back()>=1)
test.push_back(rng()%test.back());
set <int> all;
for(auto &x : test)
all.insert(x);
/// for(int i=1;i<=30;i++) all.insert(i);
test.clear();
for(auto &x : all)
test.push_back(x);
cin>>n;
for(int i=1;i<=n;i++)
{
int t;
cin>>t;
if(t==1)
{
string s;
cin>>s;
val[i]=s[0]-'a';
}
else
{
cin>>anc[i][0];
dep[i]=dep[anc[i][0]]+1;
string s;
cin>>s;
val[i]=s[0]-'a';
}
int adun=mul(val[i],pw[dep[i]]);
suf[i]=add(suf[anc[i][0]],adun);
for(int k=1;(1<<k)<=n;k++)
anc[i][k]=anc[anc[i][k-1]][k-1];
int pos=0;
for(auto &jump : all)
{
int j=get(i,jump);
int x=val[j];
int adun=mul(x,pw[pos]);
hsh[i]=add(hsh[i],adun);
pos++;
}
u[hsh[i]].push_back(i);
}
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
string t;
cin>>t;
int last=(int)t.size()-1;
int cur=0;
int pos=0;
for(auto &jump : all)
{
int j=last-jump;
int x;
if(j<0)
x=0;
else
x=t[j]-'a';
int adun=mul(x,pw[pos]);
cur=add(cur,adun);
pos++;
}
int complet=0;
for(int i=0;i<(int)t.size();i++)
{
int adun=0;
complet=add(complet,adun);
}
cout<<(int)u[cur].size()<<"\n";
int ans=0;
for(auto &it : u[cur])
{
}
}
return 0;
}