生活随笔
收集整理的這篇文章主要介紹了
hdu2222(看一些单词哪些在模式串中出现过)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自:http://www.cppblog.com/mythit/archive/2009/04/21/80633.html
題意:
t組測試數據,每組有n個單詞和一個模式串,問n個單詞有多少個在模式串中出現過。
思路:
做的第一道AC自動機模板題。。。
代碼:
#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;const int kind=26;//結點有26種,a~z
struct node
{node *fail;//失敗指針node *next[kind];int count;node(){fail=NULL;count=0;memset(next,NULL,sizeof(next));}
}*q[500001];//隊列用于bfs構造失敗指針char keyword[51];//輸入的單詞
char str[1000001];//模式串
int head,tail;//隊列頭和尾void insert(char *str,node *root)
{node *p=root;int i=0,index;while(str[i]){index=str[i]-'a';if(p->next[index]==NULL)p->next[index]=new node();p=p->next[index];i++;}p->count++;
}void build_ac(node *root)
{int i;root->fail=NULL;q[head++]=root;while(head!=tail){node *temp=q[tail++];node *p=NULL;for(int i=0;i<26;i++){if(temp->next[i]!=NULL){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[head++]=temp->next[i];}}}
}int query(node *root)
{int i=0,cnt=0,index,len=strlen(str);node *p=root;while(str[i]){index=str[i]-'a';while(p->next[index]==NULL&&p!=root)p=p->fail;p=p->next[index];p=(p==NULL)?root:p;node *temp=p;while(temp!=root&&temp->count!=-1){cnt+=temp->count;temp->count=-1;temp=temp->fail;}i++;}return cnt;
}int main()
{int t;scanf("%d",&t);while(t--){int n;head=tail=0;node *root=new node();scanf("%d",&n);getchar();while(n--){gets(keyword);insert(keyword,root);}build_ac(root);scanf("%s",str);//printf("%s\n",str);printf("%d\n",query(root));}
}
總結
以上是生活随笔為你收集整理的hdu2222(看一些单词哪些在模式串中出现过)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。