[HDU 4787] GRE Words Revenge (AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787
题目大意:
给你若干个单词,查询一篇文章里出现的单词数。。
就是被我水过去的。。。暴力重建AC自动机- -然后暴力查找。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <string>
#include <set>
using namespace std; #define CHARSET 2
#define MAX_NODE 1010000 int T,N;
char inp[]; struct trieNode{
int ch[CHARSET];
int cnt;
//bool vis;
};
trieNode trie[MAX_NODE];
int ptr,fail[MAX_NODE]; void init(){
memset(fail,,sizeof(fail));
ptr = ;
for(int i=;i<CHARSET;i++){
trie[].ch[i] = -;
}
trie[].cnt = ;
//trie[0].vis = false;
} int newNode(){
ptr++;
for(int i=;i<CHARSET;i++){
trie[ptr].ch[i] = -;
}
trie[ptr].cnt = ;
//trie[ptr].vis = false;
return ptr;
} void insert(const char* str,int L){
// printf("insert:");
int len = strlen(str);
int rt = ;
L %= len;
for(int i=;i<len;i++){
//trie[rt].vis = true;
int id = str[(i+L)%len] -'';
// printf("%d",id);
if(trie[rt].ch[id]==-){
trie[rt].ch[id] = newNode();
}
rt = trie[rt].ch[id];
}
//trie[rt].vis = true;
trie[rt].cnt = ;
// puts("");
} void build(){
queue<int> q;
//trie[0].vis = false;
q.push();
fail[] = -;
while(!q.empty()){
int t = q.front(); q.pop();
for(int i=;i<CHARSET;i++){
int v = trie[t].ch[i];
if( v==- ) continue;
// if( trie[v].vis ){
// trie[v].vis = false;
// } else continue;
int f = fail[t];
while(f!=-&&trie[f].ch[i]==-){
f = fail[f];
}
if(f==-) fail[v] = ;
else fail[v] = trie[f].ch[i];
q.push(v);
}
}
} int query(const char *str,int L){
// printf("query:");
int res = ;
int rt = ;
int len = strlen(str);
L %= len;
for(int i=;i<len;i++){
int id = str[(i+L)%len] - '';
// printf("%d",id);
while(rt&&trie[rt].ch[id]==-) rt = fail[rt];
rt = trie[rt].ch[id]; if(rt==-){
rt = ;
continue;
} int now = rt;
while(now!=-){
res += trie[now].cnt;
now = fail[now];
}
}
// puts("");
return res;
} int main(){
// freopen("output.txt","w",stdout);
scanf("%d",&T);
for(int t=;t<=T;t++){
int L = ;
init();
printf("Case #%d:\n",t);
scanf("%d",&N);
while(N--){
scanf("%s",inp);
if( inp[]=='+' ){
insert(inp+,L);
} else {
build();
int ans = query(inp+,L);
L = ans;
printf("%d\n",ans);
}
}
}
return ;
}
[HDU 4787] GRE Words Revenge (AC自动机)的更多相关文章
- HDU 3341 Lost's revenge AC自动机+dp
Lost's revenge Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- ●HDU 4787 GRE Words Revenge
题链: http://acm.hdu.edu.cn/showproblem.php?pid=4787 题解: AC自动机(强制在线构造) 题目大意: 有两种操作, 一种为:+S,表示增加模式串S, 另 ...
- GRE Words Revenge AC自动机 二进制分组
GRE Words Revenge 题意和思路都和上一篇差不多. 有一个区别就是需要移动字符串.关于这个字符串,可以用3次reverse来转换, 前面部分翻转一下, 后面部分翻转一下, 最后整个串翻转 ...
- hdu 4117 GRE Words (ac自动机 线段树 dp)
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...
- HDU 4787 GRE Words Revenge
Description Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. ...
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- HDU 5384 字典树、AC自动机
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...
- HDU 2896 病毒侵袭(AC自动机)
病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 2222 Keywords Search(AC自动机模版题)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
随机推荐
- disruptor - Concurrent Programming Framework 并发编程框架
disruptor发布了Java的2.0版本(.Net版本见这里),disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件 ...
- CSharp 如何通过拼接XML调用存储过程来查询数据
每查询数据,需要访问一次数据库,这样会影响性能:如果把查询的数据拼接成XML形式,作为一个参数整体传给存储过程来处理,这只访问数据库一次,执行速度会快很多. 1.C#代码如下: /// <sum ...
- Dynamics CRM4.0 和 Dynamics CRM2011 Plugin 实现一样的功能的方法的比较
1.给类型赋值不同 CRM4 plugin给lookup赋值为空 : Lookup lookupnull = new Lookup(); lookupnull.IsNull = true; looku ...
- Android 中Fragment使用
Android 中Fragment使用 public class MainActivity extends Activity { public static String[] array = { &q ...
- Android SDK Manager 更新失败的解决方法
Android SDK Manager 更新失败的解决方法 原文地址 最近使用Android SDK Manager 更新Android SDK tools 发现经常更新失败,获取不到更新信息: Fe ...
- Linux dirname $0 source if
$SHELL gives the full path to your default shell. $0 gives the name of your current shell. dirname是一 ...
- .NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY
.NET导入openssl生成的公钥之BEGIN RSA PUBLIC KEY 我得到了一个公钥,形式如下 -----BEGIN RSA PUBLIC KEY----- MIGJAoGBAMroxz3 ...
- Python基础教程【读书笔记】 - 2016/7/10
希望通过博客园持续的更新,分享和记录Python基础知识到高级应用的点点滴滴! 第五波:第1章 基础知识 [总览] 介绍如何得到所需的软件,然后讲一点点算法及其主要的组成.学习变量variable ...
- 138. Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
- 第二次正式java web开发项目的总结(回收站恢复)
都说互联网行业加班很是厉害,记得前不久网上还晒出了几个大城市互联网行业的加班排名调查,但是我们公司,或者说我们项目组倒是非常的例外,进公司也差不多半年了,才仅仅上个月有一个周六加过一天班而已. 不过好 ...