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);
}原文:http://blog.csdn.net/u011686226/article/details/23664813