struct acAuto{
int Next[Maxn][26] ;
int num[Maxn], fail[Maxn] ;
int cnt ;
void init(){
memset(Next, 0, sizeof(Next)) ;
memset(num, 0, sizeof(num)) ;
memset(fail, 0, sizeof(fail)) ;
cnt = 0 ;
}
void Insert(string s ){
int root = 0;
for (auto i : s){
int id = i - 'a' ;
if (!Next[root][id]){
Next[root][id] = ++cnt ;
}
root = Next[root][id] ;
}
num[root]++ ;
}
void get_fail(){
queue < int > que ;
for (int i = 0; i < 26; i++){
if (Next[0][i]) {
fail[Next[0][i]]= 0 ;
que.push(Next[0][i]) ;
}
}
while (!que.empty()){
int tmp = que.front() ;
que.pop() ;
for (int i = 0; i < 26; i++){
if (Next[tmp][i]){
fail[Next[tmp][i]] = Next[fail[tmp]][i] ;
que.push(Next[tmp][i]) ;
}
else Next[tmp][i] = Next[fail[tmp]][i] ;
}
}
}
int query (string s ){
int root = 0 ;
int ans = 0 ;
for (auto i : s){
int id = i - 'a' ;
root = Next[root][id] ;
for (int j = root; j && num[j] != -1; j = fail[j]){
ans += num[j] ;
num[j] = -1 ;
}
}
return ans ;
}
}AC ;