#define maxnode 60101
#define sigma_size 26
struct trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void init()
{
cler(ch[0],0);
sz=1;
}
int newnode()
{
cler(ch[sz],0);
val[sz]=0;
return sz++;
}
int idx(char s)
{
return s-'a';
}
void insert(char *s)
{
int u=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
ch[u][c]=newnode();
u=ch[u][c];
}
val[u]++;
}
}ac;
last数组储存着失配指针上的单词结尾的结点编号
#define maxnode 500101
#define sigma_size 26
struct trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int fail[maxnode];
int last[maxnode];
int sz;
void init()
{
cler(ch[0],0);
cler(last,0);
cler(fail,0);
sz=1;
}
int newnode()
{
cler(ch[sz],0);
val[sz]=0;
return sz++;
}
int idx(char s)
{
return s-'a';
}
void insert(char *s)
{
int u=0,len=strlen(s);
for(int i=0;i<len;i++)
{
int c=idx(s[i]);
if(!ch[u][c])
ch[u][c]=newnode();
u=ch[u][c];
}
val[u]++;
}
void getfail()
{
queue<int>q;
fail[0]=0;
for(int i=0;i<sigma_size;i++)
{
int u=ch[0][i];
if(u) {fail[u]=0;q.push(u);last[u]=0;}
}
while(!q.empty())
{
int r=q.front();q.pop();
for(int c=0;c<sigma_size;c++)
{
int u=ch[r][c];
if(!u) continue;
q.push(u);
int v=fail[r];
while(v&&!ch[v][c])
v=fail[v];
fail[u]=ch[v][c];
last[u]=val[fail[u]]?fail[u]:last[fail[u]];
}
}
}
int find(char *s)
{
int u=0,len=strlen(s),ans=0;
for(int i=0;i<len;i++)
{
int c=idx(s[i]);
while(u&&!ch[u][c]) u=fail[u];
u=ch[u][c];
int temp=u;
while(val[temp]&&temp)
{
ans+=val[temp];
val[temp]=0;
temp=fail[temp];
}
}
return ans;
}
}ac;