题目链接: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. zookeeper Keepalived

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  2. Intellij Idea 12 生成serialVersionUID的方法

    默认情况下Intellij IDEA是关闭了继承了java.io.Serializable的类生成serialVersionUID的警告.如果需要ide提示生成serialVersionUID,那么需 ...

  3. SQL开发利器SQL Prompt

    SQL开发利器SQL Prompt 5.1完全破解+使用教程 - keepfool - 博客园 http://www.cnblogs.com/keepfool/archive/2012/05/27/2 ...

  4. [转]使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试

    本文关键字:Minidumps, Windows, SEH, VisualC, .NET 摘要 本文讲述了 minidumps 是怎样工作的.当你的程序崩溃的时候应该如何生成它们.以及如何在 Visu ...

  5. 【linux】/etc/passwd文件

    /etc/passwd文件内容格式 /etc/passwd是保存用户信息的文件. 格式:用户名: 密码 : uid  : gid :用户描述:主目录:登陆shell 举个例子: root:x:0:0: ...

  6. HackerRank "The Indian Job"

    A sly knapsack problem in disguise! Thanks to https://github.com/bhajunsingh/programming-challanges/ ...

  7. 2015年8月TIOBE编程语言排行榜

    名副其实的月经贴.

  8. 4. Median of Two Sorted Arrays

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...

  9. 个人卡付款sql

    select arap_djfb.billdate as 单据日期, bd_corp.unitname as 付款单位, arap_djfb.zy as 付款摘要, bd_cubasdoc.custc ...

  10. 部署与管理ZooKeeper(转)

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...