zoukankan      html  css  js  c++  java
  • AC自动机 HDOJ 5384 Danganronpa

    题目传送门

      1 /*
      2     题意:多个文本串,多个模式串在每个文本串出现的次数
      3     AC自动机:这就是一道模板题,杭电有道类似的题目
      4 */
      5 /************************************************
      6 * Author        :Running_Time
      7 * Created Time  :2015-8-14 14:14:32
      8 * File Name     :AC.cpp
      9  ************************************************/
     10 
     11 #include <cstdio>
     12 #include <algorithm>
     13 #include <iostream>
     14 #include <sstream>
     15 #include <cstring>
     16 #include <cmath>
     17 #include <string>
     18 #include <vector>
     19 #include <queue>
     20 #include <deque>
     21 #include <stack>
     22 #include <list>
     23 #include <map>
     24 #include <set>
     25 #include <bitset>
     26 #include <cstdlib>
     27 #include <ctime>
     28 using namespace std;
     29 
     30 #define lson l, mid, rt << 1
     31 #define rson mid + 1, r, rt << 1 | 1
     32 typedef long long ll;
     33 const int MAXN = 1e5 + 10;
     34 const int MAXNODE = 6e5 + 10;
     35 const int INF = 0x3f3f3f3f;
     36 const int SIGMA_SIZE = 26;
     37 const int MOD = 1e9 + 7;
     38 ll res;
     39 struct AC   {
     40     int ch[MAXNODE][SIGMA_SIZE], f[MAXNODE], sz;
     41     ll val[MAXNODE];
     42     void init(void)   { 
     43         memset (ch[0], 0, sizeof (ch[0]));
     44         sz = 1; val[0] = 0;
     45     }
     46     int idx(char c) {
     47         return c - 'a';
     48     }
     49     void insert(string s) {
     50         int u = 0;  int len = s.size ();
     51         for (int i=0; i<len; ++i)   {
     52             int c = idx (s[i]);
     53             if (!ch[u][c])  {
     54                 memset (ch[sz], 0, sizeof (ch[sz]));
     55                 val[sz] = 0;
     56                 ch[u][c] = sz++;
     57             }
     58             u = ch[u][c];
     59         }
     60         val[u]++;
     61     }
     62     void build(void)    {
     63         queue<int> Q;   f[0] = 0;
     64         for (int i=0; i<SIGMA_SIZE; ++i)    {
     65             int u = ch[0][i];
     66             if (u)  {
     67                 f[u] = 0;   Q.push (u);
     68             }
     69         }
     70         while (!Q.empty ()) {
     71             int r = Q.front (); Q.pop ();
     72             for (int i=0; i<SIGMA_SIZE; ++i)  {
     73                 int u = ch[r][i];
     74                 if (!u) {
     75                     ch[r][i] = ch[f[r]][i];    continue;
     76                 }
     77                 Q.push (u);
     78                 f[u] = ch[f[r]][i];
     79                 val[u] += val[f[u]];
     80             }
     81         }
     82     }
     83     ll query(string s)  {       
     84         int len = s.size ();
     85         ll ret = 0; int j = 0;
     86         for (int i=0; i<len; ++i)   {
     87             int c = idx (s[i]);
     88             j = ch[j][c];
     89             ret += val[j];
     90         }
     91         return ret;
     92     }
     93 }ac;
     94 string t[MAXN], p;
     95 
     96 int main(void)    {     //HDOJ 5384 Danganronpa
     97     int T;  scanf ("%d", &T);
     98     while (T--) {
     99         int n, m;   scanf ("%d%d", &n, &m);
    100         ac.init ();
    101         for (int i=1; i<=n; ++i)    cin >> t[i];
    102         for (int i=1; i<=m; ++i)    {
    103             cin >> p;    ac.insert (p);
    104         }
    105         ac.build ();
    106         for (int i=1; i<=n; ++i)    {
    107             printf ("%I64d
    ", ac.query (t[i]));
    108         }
    109     }
    110 
    111     return 0;
    112 }
    编译人生,运行世界!
  • 相关阅读:
    Linux初识(命令, 文件, 系统管理)
    【JavaScript学习整理】DOM对象(location history screen navigator)
    Charles进行HTTPS抓包(iOS为例)
    【JavaScript学习整理】js基础
    【css学习整理】浮动,清除
    【css学习整理】css基础(样式,语法,选择器)
    【html学习整理】meta,img,表格,表单
    【LeetCode】无重复字符的最长子串
    【html学习整理】常用标签
    【LeetCode】种花问题
  • 原文地址:https://www.cnblogs.com/Running-Time/p/4737710.html
Copyright © 2011-2022 走看看