AC自动机模板
int fail[N];
int trie[N][26],tot;
int g[N];
void add(char *s,int x)
{
int p=0;
for(int i=1;s[i];i++)
{
int c=s[i]-'a';
if(!trie[p][c]) trie[p][c]=++tot;
p=trie[p][c];
}
g[p]+=x;
}
void build()
{
queue<int>q;
for(int i=0;i<26;i++)
if(trie[0][i]) q.push(trie[0][i]);
while(!q.empty())
{
int u=q.front();q.pop();
for(int i=0;i<26;i++)
{
if(trie[u][i])
{
fail[trie[u][i]]=trie[fail[u]][i];
q.push(trie[u][i]);
}
else trie[u][i]=trie[fail[u]][i];
}
}
}