light oj 1427(ac自动机)

  1 #include <bits/stdc++.h>
  2
  3 using namespace std;
  4
  5 const int N = 510*505;
  6 const int M = 27;
  7
  8
  9 map<string,int>Map;
 10 struct Trie
 11 {
 12     int next[N][M],fail[N],end[N];
 13     int root,L;
 14     int newnode()
 15     {
 16         for(int i = 0; i < 26; i++)
 17             next[L][i] = -1;
 18         end[L++] = -1;
 19         return L - 1;
 20     }
 21     void init()
 22     {
 23         L = 0;
 24         root = newnode();
 25     }
 26     void insert(string s,int id)
 27     {
 28         int len = s.size();
 29         int now = root;
 30         for(int i = 0; i < len; i++)
 31         {
 32             if(next[now][s[i]-‘a‘] == -1)
 33                 next[now][s[i] - ‘a‘] = newnode();
 34             now = next[now][s[i] - ‘a‘];
 35         }
 36         end[now] = id;
 37     }
 38     void build()
 39     {
 40         queue<int>Q;
 41         fail[root] = root;
 42         for(int i = 0; i < 26; i++)
 43         {
 44             if(next[root][i] == -1)
 45                 next[root][i] = root;
 46             else
 47             {
 48                 fail[next[root][i]] = root;
 49                 Q.push(next[root][i]);
 50             }
 51         }
 52         while(!Q.empty())
 53         {
 54             int now = Q.front();
 55             Q.pop();
 56             for(int i = 0; i < 26; i++)
 57             {
 58                 if(next[now][i] == -1)
 59                     next[now][i] = next[fail[now]][i];
 60                 else
 61                 {
 62                     fail[next[now][i]] = next[fail[now]][i];
 63                     Q.push(next[now][i]);
 64                 }
 65             }
 66         }
 67     }
 68     int num[1000];
 69     void query(char buf[],int n,int mm[])
 70     {
 71         for(int i = 1; i <= n; i++)
 72             num[i] = 0;
 73         int len = (int)strlen(buf);
 74         int now = root;
 75         for(int i = 0; i < len; i++)
 76         {
 77             now = next[now][buf[i]-‘a‘];
 78             int temp = now;
 79             while( temp != root )
 80             {
 81                 if( end[temp] != -1)
 82                     num[end[temp]]++;
 83                 temp = fail[temp];
 84             }
 85         }
 86         for(int i = 1; i <= n; i++)
 87                 printf("%d\n",num[mm[i]]);
 88     }
 89 };
 90
 91 char buf[1000100];
 92 Trie ac;
 93
 94 void solve()
 95 {
 96     ac.init();
 97     int n, l = 0;
 98     scanf("%d",&n);
 99     scanf("%s",buf);
100     Map.clear();
101     int twice[1005];
102     memset(twice,0,sizeof(twice));
103     for(int i = 1; i <= n; i++)
104     {
105         string ss;
106         cin>>ss;
107         int c = Map[ss];
108         if(c == 0)
109         {
110             Map[ss] = ++l;
111             ac.insert(ss,l);
112         }
113         twice[i] = Map[ss];
114         //int tmp = Map[ss];
115
116     }
117     ac.build();
118
119     ac.query(buf,n,twice);
120 }
121
122 int main(void)
123 {
124     int t,cnt = 0;
125     scanf("%d",&t);
126     while(t--)
127     {
128         printf("Case %d:\n",++cnt);
129         solve();
130     }
131
132     return 0;
133 }
时间: 2024-10-09 04:21:12

light oj 1427(ac自动机)的相关文章

LightOJ 1427(AC自动机

题目:给出若干模板串和一个母串,求每个模板串在母串中出现的次数. 思路:AC自动机+后缀链接(last数组) /* * @author: Cwind */ ///#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <

爬虫在线OJ评测AC自动机解决方案——牛客网为例

Step1:采集题号对应源码,解析页面,保存数据库. Step2:寻找评测接口,多线程模拟提交,评测代码,记录AC代码. Step3:提交AC代码. 效果评测:由于G20峰会,HDU评测系统挂了,目测正确提交已达1300题,可以刷到榜首!

[C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ

前言 做过杭电.浙大或是北大等ACM题库的人一定对“刷题”不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到“Online Exercise”下的“Problem Archive”,然后从众多题目中选择一个进行读题.构思.编程.然后提交.最后查看题解状态,如果AC了表示这一题被攻克了,否则就要重做了~一般情况下,“刷题”要求精神高度集中且经验丰富,否则很难成功AC,有时候甚至做一题要浪费半天的时间!(有时网速卡了,比抢火车票还要急!) 楼主在

LightOJ 1427 Substring Frequency (II) (AC自动机)

题意:给定一个文本串和 n 个子串,问你子串在文本串出现的次数. 析:很明显的AC自动机,只要把先把子串进行失配处理,然后再去用文本串去匹配,在插入子串时就要标记每个串,注意串可能是相同的,这个我错了两次,最后匹配一次就OK了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib

【模版】AC自动机(简单版)

题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. 输入输出格式 输入格式: 第一行一个n,表示模式串个数: 下面n行每行一个模式串: 下面一行一个文本串. 输出格式: 一个数表示答案 输入输出样例 输入样例#1: 2 a aa aa 输出样例#1: 2 说明 subtask1[50pts]:∑length(模式串)<=10^6,len

Aho_Corasick自动机(AC自动机)

首先,AC自动机不是Accept自动机,别以为把这段代码复制到OJ上就全都自动AC了…… 其实这玩意是Aho-Corasick 造出来的,所以你懂的. 那么这玩意能干嘛咧? •字符串的匹配问题 •多串的匹配问题※ 看不懂吧?解释一下: 例如给几个单词 acbs,asf,dsef,再给出一个 很长的文章,acbsdfgeasf,问在这个文章中,总共出现了多少个单词,或者是单词出现的总次数. 怎么实现的呢,就是KMP+trie树.是以KMP为算法基础,trie为索引结构的东东.那它如何与kmp联系在

[DP] Light Oj 1017 Brush(III)

题目为 light oj 1017. 现在是凌晨两点二十分,我却毫无睡意,这题折腾了我一个晚上,一直没有做对,最后发现转移方程忽略了一个重要的条件,泪奔-. 干脆不睡觉,写一篇题解警醒自己,也算是对于自己考虑问题智障的惩罚. 我真是个智障 0 s 0 ..... 题目大意是 , 给你N个二维坐标上的点 (x,y) , 每一个点代表一个污渍,现在有一把宽度为 W 的刷子,平行于 x 轴移动 K 次,问,最多能擦掉多少污渍. 很明显这题和x坐标一点关系都没有(因为刷子沿着平行x轴移动,并可以移动无限

C++之路进阶——AC自动机(文本生成器)

F.A.Qs Home Discuss ProblemSet Status Ranklist Contest ModifyUser  hyxzc Logout 捐赠本站 Notice:由于本OJ建立在Linux平台下,而许多题的数据在Windows下制作,请注意输入.输出语句及数据类型及范围,避免无谓的RE出现. 1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2991  Solved: 1225[Subm

light oj 1066Gathering Food (bfs 稍微有点小坑)

1066 - Gathering Food Winter is approaching! The weather is getting colder and days are becoming shorter. The animals take different measures to adjust themselves during this season. - Some of them "migrate." This means they travel to other plac