标签:des style color os io strong for ar
1 5 she he say shr her yasherhs
3#include <iostream> # include<cstring> # include<cstdio> # include<queue> using namespace std; struct node { node *fail; //失败指针 node *next[26]; //Tire每个节点的26个子节点(最多26个字母) int count; //是否为该单词的最后一个节点 node(){ //构造函数初始化 fail=NULL; count=0; memset(next,NULL,sizeof(next)); } }*q[1<<6|5]; char keyword[50+5]; //输入的单词 char str[1<<6|5]; //模式串 void insert(char *str, node *root) //建立字典树 { node *p=root; for(int i=0;str[i]!='\0';i++) { int id=str[i]-'a'; if(p->next[id]==NULL) p->next[id]=new node(); p=p->next[id]; } p->count++; } void build_ac_automation(node *root) { queue<node *> Q; int i; root->fail=NULL; Q.push(root); while(!Q.empty()) { node *temp=Q.front(); Q.pop(); node *p=NULL; for(i=0;i<26;i++) { if(temp->next[i]!=NULL) //temp 为父结点 { 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; //p=p->fail也就是p=NULL } if(p==NULL) temp->next[i]->fail=root; } Q.push(temp->next[i]); } } } } int query(node *root) { int i=0,cnt=0,len=strlen(str); node *p=root; for(int i=0;i<len;i++) { int id=str[i]-'a'; while(p->next[id]==NULL && p!=root) p=p->fail; p=p->next[id]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root && temp->count!=-1) { cnt+=temp->count; temp->count=-1; //表示该单词已经出现过了,防止重复计数 temp=temp->fail; //temp指向e节点的失败指针所指向的节点继续查找 } } return cnt; } int main() { int n,t; scanf("%d",&t); while(t--) { node *root=new node(); scanf("%d",&n); getchar(); while(n--) { gets(keyword); insert(keyword,root); } build_ac_automation(root); scanf("%s",str); printf("%d\n",query(root)); } return 0; }
Keywords Search (ac 自动机),布布扣,bubuko.com
标签:des style color os io strong for ar
原文地址:http://blog.csdn.net/u013514722/article/details/38521411