题目链接: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自动机)的更多相关文章

  1. 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 ...

  2. ●HDU 4787 GRE Words Revenge

    题链: http://acm.hdu.edu.cn/showproblem.php?pid=4787 题解: AC自动机(强制在线构造) 题目大意: 有两种操作, 一种为:+S,表示增加模式串S, 另 ...

  3. GRE Words Revenge AC自动机 二进制分组

    GRE Words Revenge 题意和思路都和上一篇差不多. 有一个区别就是需要移动字符串.关于这个字符串,可以用3次reverse来转换, 前面部分翻转一下, 后面部分翻转一下, 最后整个串翻转 ...

  4. hdu 4117 GRE Words (ac自动机 线段树 dp)

    参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...

  5. HDU 4787 GRE Words Revenge

    Description Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. ...

  6. HDU 2457 DNA repair(AC自动机+DP)题解

    题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...

  7. HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384 用字典树.AC自动机两种做法都可以做 #include<stdio.h> #includ ...

  8. HDU 2896 病毒侵袭(AC自动机)

    病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. HDU 2222 Keywords Search(AC自动机模版题)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

随机推荐

  1. Jquery获得下拉框的值

    转自:http://blog.csdn.net/jing_xin/article/details/8007794 获取Select : 获取select 选中的 text : $("#ddl ...

  2. Hive(一):架构及知识体系

    Hive是一个基于Hadoop的数据仓库,最初由Facebook提供,使用HQL作为查询接口.HDFS作为存储底层.mapReduce作为执行层,设计目的是让SQL技能良好,但Java技能较弱的分析师 ...

  3. jQuery网页右侧固定层显示隐藏在线qq客服代码

    CSS代码: @charset "utf-8"; ;;} html,body{font-size:12px;font-family:"微软雅黑";outline ...

  4. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  5. bzoj2537: [neerc2007]Language Recognition

    Description DFA(确定性有限状态自动机)是一个有向图,顶点称为状态,边称为转移.每个转移用一个字母标记.对于每个状态s和每个转移l,至多有一个转移从s出发且标记为l.DFA有一个初始状态 ...

  6. 【转】SVN服务器客户端以及环境的搭建和使用

    vss,cvs,svn三者都是版本控制工具 vss是锁定-编辑-解锁模式,svn虽然也支持锁定,但默认是修改-冲突-合并模式 vss的版本号对应的是单个文件,svn的版本号对应的是整个版本库 vss是 ...

  7. visual studio 声明数组太大,导致栈溢出

    在解释原因前我们先看一下一个由C/C++编译的程序占用的内存分为几个部分: 1.栈区(stack segment):由编译器自动分配释放,存放函数的参数的值,局部变量的值等.在Windows下,栈是向 ...

  8. 8. redis的主从复制和sentinal

    一. redis主从复制(读写分离) redis的主从复制分为两类节点:1个master和多个slave,master进行读写操作,slav进行只读操作 启动步骤: 主节点照常启动,slave节点启动 ...

  9. OAF_EO系列7 - OAException异常处理及实现(案例)

    2014-06-12 Created By BaoXinjian

  10. cf 645F Cowslip Collections 组合数学 + 简单数论

    http://codeforces.com/contest/645/problem/F F. Cowslip Collections time limit per test 8 seconds mem ...