AC自动机 hdu2222

 1 #include <iostream>

 2 using namespace std;

 3 

 4 struct Node{

 5     Node *next[26];

 6     Node* fail;

 7     int count;

 8     Node(){

 9         for (int i = 0; i < 26; i++){

10             next[i] = NULL;

11         }

12         fail = NULL;

13         count = 0;

14     }

15 };

16 char words[51], s[1000001];

17 Node* d[500001];

18 void insert(char words[], Node *root){

19     int i, len = strlen(words), v;

20     Node *p = root;

21     for (i = 0; i < len; i++){

22         v = words[i] - 'a';

23         if (p->next[v] == NULL){

24             p->next[v] = new Node();

25         }

26         p = p->next[v];

27     }

28     p->count++;

29 }

30 void build(Node *root){

31     int head, tail, i;

32     Node *p, *temp;

33     head = 0;

34     tail = 0;

35     root->fail = NULL;

36     d[head] = root;

37     while (head <= tail){

38         temp = d[head++];

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

40             if (temp->next[i] == NULL) continue;

41             if (temp == root){

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

43             }

44             else{

45                 p = temp->fail;

46                 while (p != NULL){

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

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

49                         break;

50                     }

51                     p = p->fail;

52                 }

53                 if (p == NULL){

54                     temp->next[i]->fail = root;

55                 }

56             }

57             d[++tail] = temp->next[i];

58         }

59     }

60 }

61 

62 int query(char s[], Node* root){

63     int ans = 0, len = strlen(s), i, v;

64     Node *p = root, *temp;

65     for (i = 0; i < len; i++){

66         v = s[i] - 'a';

67         while (p->next[v] == NULL && p != root){

68             p = p->fail;

69         }

70         p = (p->next[v] != NULL) ? p->next[v] : root;

71         temp = p;

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

73             ans += temp->count;

74             temp->count = -1;

75             temp = temp->fail;

76         }

77     }

78     return ans;

79 }

80 

81 int main(){

82     int m, n, i;

83     Node *root;

84     cin >> m;

85     while (m--){

86         root = new Node();

87         cin >> n;

88         for (i = 0; i < n; i++){

89             cin >> words;

90             insert(words, root);

91         }

92         build(root);

93         cin >> s;

94         cout << query(s, root) << endl;

95     }

96 }
View Code

 

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