struct node
{
int val;
node *next[26];
node *fail;
node()
{
val = 0;
for(int i = 0; i < 26; i++)
next[i] = NULL;
fail = NULL;
}
};
node *root;
void insert(char *s)
{
int n = strlen(s);
node *curr = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - 'a';
if(curr->next[c] == NULL)
{
node *newnode = new node;
curr->next[c] = newnode;
}
curr = curr->next[c];
}
curr->val++;
}
void build()
{
root->fail = NULL;
queue <node*> Q;
Q.push(root);
while(!Q.empty())
{
node *temp = Q.front();
node *p = NULL;
Q.pop();
for(int i = 0; i < 26; i++)
{
if(temp->next[i] == NULL)
continue;
if(temp == root)
temp->next[i]->fail = root;
else
{
p = temp->fail;
while(p != NULL)
{
if(p->next[i] != NULL)
{
temp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(p == NULL)
temp->next[i]->fail = root;
}
Q.push(temp->next[i]);
}
}
}
void find(char *s)
{
int n = strlen(s);
node *p = root;
for(int i = 0; i < n; i++)
{
int c = s[i] - 'a';
while(p != root && p->next[c] == NULL)
p = p->fail;
p = p->next[c];
if(p == NULL)
p = root;
node *temp = p;
while(temp != root)
{
ans += temp->val;
temp->val = 0;
temp = temp->fail;
}
}
}
void del(node *p)
{
for(int i = 0; i < 26; i++)
{
if(p->next[i] != NULL)
del(p->next[i]);
}
free(p);
}
const int maxnode = 500*210;
const int size = 128;
int ch[maxnode][size];
int val[maxnode];
int f[maxnode];
int sz;
bool id[maxn];
void init()
{
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}
void insert(char *s, int v)
{
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++)
{
int c = s[i];
if(!ch[u][c])
{
memset(ch[sz], 0, sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
void getFail()
{
queue <int> q;
f[0] = 0;
for(int c = 0; c < size; c++)
{
int u = ch[0][c];
if(u)
{
f[u] = 0;
q.push(u);
}
}
while(!q.empty())
{
int r = q.front(); q.pop();
for(int c = 0; c < size; c++)
{
int u = ch[r][c];
if(!u)
{
ch[r][c] = ch[f[r]][c];
continue;
}
q.push(u);
f[u] = ch[f[r]][c];
}
}
}
void find(char *s, int num)
{
int n = strlen(s);
int j = 0;
for(int i = 0; i < n; i++)
{
j = ch[j][s[i]];
int temp = j;
while(temp)
{
if(val[temp] > 0)
{
;
}
temp = f[temp];
}
}
}