[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 ...
随机推荐
- ExpandableListView方法详解
正文 一.结构public interface ExpandableListAdapter 间接子类:BaseExpandableListAdapter,CursorTreeAdapter,Resou ...
- The launch will only sync the application package on the device!
在开始学习Android的开发时,有时候可能刚写完一个布局文件,就急忙忙的运行程序,此时会毫不留情的在控制台报错:No Launcher activity found! The launch will ...
- android数据存储之File
android中使用File进行存储主要使用到OpenFileOutput和OpenFileInput两个方法,下面直接用一个例子来说明一下. (1)布局文件main.xml文件 <?xml v ...
- paypal接口对接注意事项
追加:新的设定画面 在paypal对接过程中,会存在return_url和notify两种 分别用pdt和ipn实现 但是对于paypal,大家请注意,真实环境和沙盒测试环境的区别 你可以到www.p ...
- R提高篇(三): 数据管理一
目录: 创建新变量 变量重编码 日期值 数据排序 数据集合并 数据子集 随机取样 创建新变量 算术运算函数:x%%y [求余 x mod y, 5%%2的结果为1], x%/%y [整数除法,5% ...
- UCloud内核热补丁技术揭秘
- Window下Nexus私服搭建
项目组大部分人员不能访问maven的central repository,因此在局域网里找一台有外网权限的机器,搭建nexus私服,然后开发人员连到这台私服上 环境是:nexus-2.1.1.mav ...
- android如何播放资源文件夹raw中的视频
转自这里 videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/&qu ...
- datagridview 不显示行号的问题
环境:C#,Winform 场景: 窗体上有两个tab页A.B,每个tab页上都有一个DatagridView.窗体加载后,显示tab A选项卡.序号正常显示,但点击B选项卡后,DatagridVie ...
- 使用eclipse和maven生成java web程序war包
一.eclipse中,在需要打包的项目名上右击,然后把鼠标光标指向弹出框中的“run as”: 二.之后会看到在这个弹出框的右侧会出现一个悬浮窗,如下: 三.在上边的第二个悬浮窗鼠标点击“maven ...