AC自动机模板代码

 1 #include <iostream>

 2 using namespace std;

 3 const int kind = 26;

 4 struct node{

 5 node *fail; //失败指针

 6 node *next[kind]; //Tire每个节点的26个子节点(最多26个字母)

 7 int count; //是否为该单词的最后一个节点

 8 node(){ //构造函数初始化

 9 fail=NULL;

10 count=0;

11 memset(next,NULL,sizeof(next));

12 }

13 }*q[500001]; //队列,方便用于bfs构造失败指针

14 char keyword[51]; //输入的单词

15 char str[1000001]; //模式串

16 int head,tail; //队列的头尾指针

17 void insert(char *str,node *root){

18 node *p=root;

19 int i=0,index;

20 while(str[i]){

21 index=str[i]-'a';

22 if(p->next[index]==NULL) p->next[index]=new node();

23 p=p->next[index];

24 i++;

25 }

26 p->count++;

27 }

28 void build_ac_automation(node *root){

29 int i;

30 root->fail=NULL;

31 q[head++]=root;

32 while(head!=tail){

33 node *temp=q[tail++];

34 node *p=NULL;

35 for(i=0;i<26;i++){

36 if(temp->next[i]!=NULL){

37 if(temp==root) temp->next[i]->fail=root;

38 else{

39 p=temp->fail;

40 while(p!=NULL){

41 if(p->next[i]!=NULL){

42 temp->next[i]->fail=p->next[i];

43 break;

44 }

45 p=p->fail;

46 }

47 if(p==NULL) temp->next[i]->fail=root;

48 }

49 q[head++]=temp->next[i];

50 }

51 }

52 }

53 }

54 int query(node *root){

55 int i=0,cnt=0,index,len=strlen(str);

56 node *p=root;

57 while(str[i]){

58 index=str[i]-'a';

59 while(p->next[index]==NULL && p!=root) p=p->fail;

60 p=p->next[index];

61 p=(p==NULL)?root:p;

62 node *temp=p;

63 while(temp!=root && temp->count!=-1){

64 cnt+=temp->count;

65 temp->count=-1;

66 temp=temp->fail;

67 }

68 i++;

69 }

70 return cnt;

71 }

72 int main(){

73 int n,t;

74 scanf("%d",&t);

75 while(t--){

76 head=tail=0;

77 node *root=new node();

78 scanf("%d",&n);

79 getchar();

80 while(n--){

81 gets(keyword);

82 insert(keyword,root);

83 }

84 build_ac_automation(root);

85 scanf("%s",str);

86 printf("%d\n",query(root));

87 }

88 return 0;

89 }

 

你可能感兴趣的:(AC自动机)