指针版写法:
- 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);
- }
数组版写法