zoukankan      html  css  js  c++  java
  • hdu 2222 ac自动机模板题

    题意

    Sample Input
    1
    5
    she
    he
    say
    shr
    her
    yasherhs


    Sample Output
    3

      1 #include <stdio.h>
      2 #include <algorithm>
      3 #include <iostream>
      4 #include <string.h>
      5 #include <queue>
      6 using namespace std;
      7 struct Trie
      8 {
      9     int next[500010][26],fail[500010],end[500010];
     10     int root,L;
     11     int newnode()
     12     {
     13         for(int i = 0;i < 26;i++)
     14         next[L][i] = -1;
     15         end[L++] = 0;
     16         return L-1;
     17     }
     18     void init()
     19     {
     20         L = 0;
     21         root = newnode();
     22     }
     23     void insert(char buf[])
     24     {
     25         int len = strlen(buf);
     26         int now = root;
     27         for(int i = 0;i < len;i++)
     28         {
     29             if(next[now][buf[i]-'a'] == -1)
     30             next[now][buf[i]-'a'] = newnode();
     31             now = next[now][buf[i]-'a'];
     32         }
     33         end[now]++;
     34     }
     35     void build()
     36     {
     37         queue<int>Q;
     38         fail[root] = root;
     39         for(int i = 0;i < 26;i++)
     40         if(next[root][i] == -1)
     41         next[root][i] = root;
     42         else
     43         {
     44             fail[next[root][i]] = root;
     45             Q.push(next[root][i]);
     46         }
     47         while( !Q.empty() )
     48         {
     49             int now = Q.front();
     50             Q.pop();
     51             for(int i = 0;i < 26;i++)
     52             if(next[now][i] == -1)
     53             next[now][i] = next[fail[now]][i];
     54             else
     55             {
     56                 fail[next[now][i]]=next[fail[now]][i];
     57                 Q.push(next[now][i]);
     58             }
     59         }
     60     }
     61     int query(char buf[])
     62     {
     63         int len = strlen(buf);
     64         int now = root;
     65         int res = 0;
     66         for(int i = 0;i < len;i++)
     67         {
     68             now = next[now][buf[i]-'a'];
     69             int temp = now;
     70             while( temp != root )
     71             {
     72                 res += end[temp];
     73                 end[temp] = 0;
     74                 temp = fail[temp];
     75             }
     76         }
     77         return res;
     78     }
     79     void debug()
     80     {
     81         for(int i = 0;i < L;i++)
     82         {
     83             printf("id = %3d,fail = %3d,end = %3d,chi = [",i,fail[i],end[i]);
     84             for(int j = 0;j < 26;j++)
     85             printf("%2d",next[i][j]);
     86             printf("]
    ");
     87         }
     88     }
     89 };
     90 char buf[1000010];
     91 Trie ac;
     92 int main()
     93 {
     94     int T;
     95     int n;
     96     scanf("%d",&T);
     97     while( T-- )
     98     {
     99         scanf("%d",&n);
    100         ac.init();
    101         for(int i = 0;i < n;i++)
    102         {
    103             scanf("%s",buf);
    104             ac.insert(buf);
    105         }
    106         ac.build();
    107         scanf("%s",buf);
    108         printf("%d
    ",ac.query(buf));
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    Qt简介以及如何配置Qt使用VS2010进行开发
    QT里重定向另外一个控制台程序的输出
    windows下制作PHP扩展
    20款Notepad++插件下载和介绍
    音频编码协议介绍
    用 PHP 读取文件的正确方法
    QT进程间通信
    关于YUV色彩空间
    解析xml 四种
    System.getProperty
  • 原文地址:https://www.cnblogs.com/cnblogs321114287/p/4441918.html
Copyright © 2011-2022 走看看