#include<bits/stdc++.h> using namespace std; const int MAX=1e6; int trie[MAX][30]; int sum[MAX]; int tot; void build_trie(string s){ int root=0; for(int i=0,len=s.length();i<len;i++){ int id=s[i]-'a'; if(trie[root][id]==0) trie[root][id]=++tot; root=trie[root][id]; } sum[root]++; } void get_fail(){ queue<int> que; for(int i=0;i<26;i++) if(trie[0][i]){fial[0][i]=0;que.push(trie[0][i]);} while(que.empty()){ int now=que.front(); que.pop(); for(int i=0;i<26;i++) if(trie[now][i]) { que.push(trie[now][i]); fail[trie[now][i]]=trie[faie[now]][i]; } else trie[now][i]=trie[fail[now]][i]; } } int query(string s){ int now=0; int ans=0; for(int i=0,len=s.length();i<len;i++){ now=trie[now][s[i]-'a' temp=now; while(temp!=0) { ans+=sum[temp]; temp=fail[temp]; } } } return ans; }