Description

  Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. At each day, Coach Pang can:
   "+w": learn a word w
   "?p": read a paragraph p, and count the number of learnt words. Formally speaking, count the number of substrings of p which is a learnt words.
  Given the records of N days, help Coach Pang to find the count. For convenience, the characters occured in the words and paragraphs are only '0' and '1'.
 
 

Solution

这题网上大部分题解都是错的,只能说数据太水
首先这题用到AC自动机,如果暴力做每一组询问需要getfail一次,但是这样做也能AC.
考虑合并,我们建立两个AC自动机,保证其中一个大小\(<\sqrt{n}\) 每一次对小的进行getfail,复杂度只有\(O(\sqrt{n})\),如果小的 \(size\) 达到了 \(\sqrt{n}\),考虑暴力合并,复杂度 \(O(\sqrt{n})\)
注意一个细节,一个单词只能学习一次,所以每加一次需要判断之前是否存在,网上大部分都没有做这个

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=100005,M=600005;
int m,kase=0,ans=0,B=100,root=0;char s[M*10];
queue<int>q;
struct Ac{int size,ch[M][2],fail[M],val[M];int newnode(){size++;ch[size][0]=ch[size][1]=0;fail[size]=0;val[size]=0;return size;}void clear(){size=-1;newnode();}void ins(char *S){int x,len=strlen(s),p=root;for(int i=1;i<len;i++){x=S[i]-'0';if(ch[p][x])p=ch[p][x];else ch[p][x]=newnode(),p=ch[p][x];}val[p]|=1;}void getfail(){while(!q.empty())q.pop();q.push(root);int x,u,v;while(!q.empty()){x=q.front();q.pop();for(int i=0;i<=1;i++){if(!ch[x][i])continue;u=fail[x];while(u && !ch[u][i])u=fail[u];if(ch[u][i] && ch[u][i]!=ch[x][i])fail[ch[x][i]]=ch[u][i];v=ch[x][i];q.push(v);}}}int query(char *S){int x,len=strlen(S),p=root,ret=0,u;for(int i=1;i<len;i++){x=S[i]-'0';while(p && !ch[p][x])p=fail[p];p=ch[p][x];u=p;while(u)ret+=val[u],u=fail[u];}return ret;}bool check(char *S){int len=strlen(S),x,p=root;for(int i=1;i<len;i++){x=S[i]-'0';if(!ch[p][x])return false;p=ch[p][x];}return val[p];}
}A,C;
void dfs(int art,int crt){int x;for(int i=0;i<=1;i++)if(C.ch[crt][i]){if(!A.ch[art][i])A.ch[art][i]=A.newnode();x=A.ch[art][i];A.val[x]|=C.val[C.ch[crt][i]];dfs(x,C.ch[crt][i]);}
}
char b[N];
void Moveit(){int k=ans,len=strlen(s),p=1;k%=(len-1);for(int i=1;i<=k;i++)b[i]=s[i];for(int i=1;k<len-1;i++)s[i]=s[++k];for(int i=len-(ans%(len-1));i<len;i++)s[i]=b[p++];
}
void work()
{printf("Case #%d:\n",++kase);scanf("%d",&m);A.clear();C.clear();ans=0;while(m--){scanf("%s",s);Moveit();if(s[0]=='+'){if(A.check(s) || C.check(s))continue;C.ins(s);if(C.size>B){dfs(0,0);A.getfail();C.clear();}else C.getfail();}else ans=A.query(s)+C.query(s),printf("%d\n",ans);}
}int main()
{int T;cin>>T;while(T--)work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/7661370.html

HDU 4787 GRE Words Revenge相关推荐

  1. HDU - 3341 Lost's revenge(AC自动机+状压dp)

    题目链接:点击查看 题目大意:给出 n 个模式串,最后给出一个匹配串,问如何重新排列匹配串,可以使得匹配串尽可能多的匹配模式串 题目分析:因为是模式串和匹配串的匹配,所以考虑AC自动机,因为数据范围比 ...

  2. HDU 4117 GRE Words

    这道题不难想到这样的dp. dp[字符串si] = 以si为结尾的最大总权值. dp[si] = max(dp[sj]) ,1.j < i,2.sj是si的子串. 对于第二个条件,是一个多模版串 ...

  3. HDU 3341 Lost's revenge(AC自动机+状态压缩DP)

    Description 给出N个优良的基因段,每段长度小于等于10,只含有AGCT四种碱基. 现给一段基因片段S,|S|<=40.对其重排列后,最多能含有多少个优良基因,基因段可以有公共部分 I ...

  4. HDU 4787 在线AC自动机 分块(模式串和母串交叉给出,多次求getFail)

    题意: 给定T个测试数据 n个操作 + 插入单词 ? 询问母串中有多少个子串 在上面出现过 ( 子串被加密,即←移动L位 (L为上次询问的答案) ) 分块思路: 因为模式串和母串交叉给出,正常来说应该 ...

  5. 2013_chengdu_onsite

    4781 Assignment For Princess 构造题目,可以先构造前n条边,然后对于剩下的m-n条边,一直构造搜索w%3==0. 4782 Beautiful Soup 直接模拟即可,不过 ...

  6. pg安装部署linux_Linux下postgresql数据库部署与配置

    1.检查postgresql是否已经安装:rpm -qa | grep postgres 2.检查PostgreSQL 安装位置:rpm -qal | grep postgres 3.卸载Postgr ...

  7. kuangbin带你飞专题合集

    题目列表 [kuangbin带你飞]专题一 简单搜索 [kuangbin带你飞]专题二 搜索进阶 [kuangbin带你飞]专题三 Dancing Links [kuangbin带你飞]专题四 最短路 ...

  8. 算法学习经典例题整理

    陆续会对本篇博客进行更新! 搜索:https://vjudge.net/contest/292597 区间DP:https://vjudge.net/contest/293892 树状背包:https ...

  9. 第九周 10.25-10.31

    10.25 HDU 4117 GRE Words 卡了很久的一个题目.比较综合. 看了很久题解还是各种写挫. 毕竟除了模拟题都没敲过那么长的. 题意:按顺序给N个单词,每个单词有权值,删去其中任意单词 ...

最新文章

  1. Java学习总结:12
  2. ntop和Cacti
  3. response.redirect 正在中止线程
  4. NIOS II spi详解
  5. pat乙级相当于什么水平_林书豪在CBA相当于什么水平的外援?
  6. 基于Conditional Layer Normalization的条件文本生成
  7. html5 fc,HTML5_mob604756fc093d的技术博客_51CTO博客
  8. 【好文】为什么必须学好.Net Core?怎样弯道超车新年高薪?这样做,一周就够了!(文末彩蛋)...
  9. 为什么CAP不能同时满足的简单理解
  10. 设计模式的C语言应用-适配及系列模式-第六章
  11. C语言学习笔记---指针和数组
  12. Postgresql 插入json数据
  13. [转帖]windows+xshell+xming访问非桌面版Linux服务器
  14. asp.net core abp 视频教程1
  15. 想实现华为BLM模型,人力资源必不可少
  16. 木马 + 流氓软件 + 垃圾软件 玩死 Win 2000 pro~
  17. Android studio调取支付宝健康码
  18. Linux-Ngrok内网穿透
  19. Nginx启动和停止报No mapping for the Unicode character exists in the target multi-byte code...错误的解决方法
  20. qt linux获取安装目录路径

热门文章

  1. Mybatis 逆向工程 自动生成代码
  2. 自学linux指令分析-find
  3. Mysql 索引的基础(下)
  4. 35丨基础篇:C10K和C1000K回顾
  5. 文件copy模块shutil
  6. k8s 里的kv和kvs
  7. x722网卡支持百兆吗_同样是无线网卡,为什么要选千兆的?
  8. linux mail.rc 端口,配置mail.rc 文件并使用mail发送邮件的详细配置
  9. #1049 : 后序遍历(二叉树,DFS)
  10. 1776: Press the switch(思维题)