BZOJ2780: [Spoj]8093 Sevenk Love Oimaster(广义后缀自动机,Parent树,Dfs序)
Description
Input
Output
For each question, output the answer in one line.
Sample Input
abcabcabc
aaa
aafe
abc
a
ca
Sample Output
3
解题思路:
利用Parent树的子节点都是父节点母串的性质,在大串的每个实节点打上标记,然后构建出这颗Parent树。
那么我们的问题就变成了在一个Fail节点子树内不同颜色个数。
像不像HH的项链?
把Dfs序构建出来,离线树状数组就好了。
代码:
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- const int N=;
- const int M=;
- struct sant{
- int tranc[];
- int len;
- int pre;
- }s[N];
- struct pnt{
- int hd;
- int col;
- int ind;
- int oud;
- }p[N];
- struct ent{
- int twd;
- int lst;
- }e[N];
- struct qust{
- int l,r;
- int ans;
- int no;
- }q[N];
- int siz;
- int fin;
- int n,Q;
- int cnt;
- int dfn;
- char tmp[N];
- int line[N];
- int lst[N];
- int phr[N];
- int col[N];
- void Insert(int c,int whic)
- {
- int nwp,nwq,lsp,lsq;
- nwp=++siz;
- p[nwp].col=whic;
- s[nwp].len=s[fin].len+;
- for(lsp=fin;lsp&&!s[lsp].tranc[c];lsp=s[lsp].pre)
- s[lsp].tranc[c]=nwp;
- if(!lsp)
- s[nwp].pre=;
- else{
- lsq=s[lsp].tranc[c];
- if(s[lsq].len==s[lsp].len+)
- s[nwp].pre=lsq;
- else{
- nwq=++siz;
- s[nwq]=s[lsq];
- s[nwq].len=s[lsp].len+;
- s[nwp].pre=s[lsq].pre=nwq;
- while(s[lsp].tranc[c]==lsq)
- {
- s[lsp].tranc[c]=nwq;
- lsp=s[lsp].pre;
- }
- }
- }
- fin=nwp;
- return ;
- }
- void ade(int f,int t)
- {
- cnt++;
- e[cnt].twd=t;
- e[cnt].lst=p[f].hd;
- p[f].hd=cnt;
- return ;
- }
- void Dfs(int x)
- {
- p[x].ind=++dfn;
- phr[dfn]=x;
- col[dfn]=p[x].col;
- for(int i=p[x].hd;i;i=e[i].lst)
- {
- int to=e[i].twd;
- Dfs(to);
- }
- p[x].oud=dfn;
- return ;
- }
- bool cmp(qust x,qust y)
- {
- return x.r<y.r;
- }
- bool cmq(qust x,qust y)
- {
- return x.no<y.no;
- }
- int lowbit(int x)
- {
- return x&(-x);
- }
- void update(int pos,int x)
- {
- while(pos&&pos<=siz)
- {
- line[pos]+=x;
- pos+=lowbit(pos);
- }
- return ;
- }
- int query(int pos)
- {
- int ans=;
- while(pos)
- {
- ans+=line[pos];
- pos-=lowbit(pos);
- }
- return ans;
- }
- int main()
- {
- fin=++siz;
- scanf("%d%d",&n,&Q);
- for(int i=;i<=n;i++)
- {
- scanf("%s",tmp+);
- fin=;
- int len=strlen(tmp+);
- for(int j=;j<=len;j++)
- Insert(tmp[j]-'a',i);
- }
- for(int i=;i<=siz;i++)
- ade(s[i].pre,i);
- Dfs();
- for(int i=;i<=Q;i++)
- {
- scanf("%s",tmp+);
- int root=;
- int len=strlen(tmp+);
- for(int j=;j<=len;j++)
- root=s[root].tranc[tmp[j]-'a'];
- q[i].no=i;
- if(!root)
- continue;
- q[i].l=p[root].ind;
- q[i].r=p[root].oud;
- }
- std::sort(q+,q+Q+,cmp);
- int rr=;
- for(int i=;i<=Q;i++)
- {
- while(rr<=q[i].r)
- {
- if(!col[rr])
- {
- rr++;
- continue;
- }
- if(lst[col[rr]])
- update(lst[col[rr]],-);
- update(rr,);
- lst[col[rr]]=rr;
- rr++;
- }
- rr--;
- if(!q[i].l)
- continue;
- q[i].ans=query(q[i].r)-query(q[i].l-);
- }
- std::sort(q+,q+Q+,cmq);
- for(int i=;i<=Q;i++)
- printf("%d\n",q[i].ans);
- return ;
- }
BZOJ2780: [Spoj]8093 Sevenk Love Oimaster(广义后缀自动机,Parent树,Dfs序)的更多相关文章
- 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机
[BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other. But r ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3277 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster ——广义后缀自动机
给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...
- 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)
[BZOJ2780][SPOJ]Sevenk Love Oimaster(后缀自动机) 题面 BZOJ 洛谷 题解 裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括 ...
- BZOJ2780 [Spoj]8093 Sevenk Love Oimaster 【广义后缀自动机】
题目 Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXun was dat ...
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
- SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)
题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ...
- BZOJ2780——[Spoj]8093 Sevenk Love Oimaster
0.题意:给定N个原始字符串S,M次查询某个特殊的字符串S'在多少个原始串中出现过. 1.分析:这个题我们第一感觉就是可以用后缀自动机来搞,然后我们发现不是本质不同的字串..求出现过的次数,也就是说多 ...
随机推荐
- 受不了Android SDK文档打开缓慢问题,自己开发简易脱机浏览器。
google android sdk离线文档打开的时候特别慢,据说是要从谷歌官网拉取一些东西导致的.脱机浏览能够解决该问题.PC端能够使用firefox. 可是Android端貌似没有支持脱机工作的浏 ...
- 我持续推动Rust语言支持Windows XP系统
前言 Rust好像长期以来不支持Windows XP系统.有不少用户发帖提议官方支持XP,基本上都被Rust官方开发人员明白的拒绝了.他们的对话大致上是以这种形式開始和结束的(当中乙方代表官方及其拥趸 ...
- 怎样安装Windows7操作系统
1. 打开电脑,插入Windows7安装光盘. 2. 又一次启动电脑: 3. 依据提示按下对应的键.进入选择启动项菜单选择光驱引导.在"Boot Menu"界面按键盘上下键选 ...
- js易错点总结及 常见面试的坑
最近在研究Javascript发现了其中一些比较灵异的事情.有点让人感到无语比如: var arr = [], arr2 = {}; console.log(typeof(arr) === typeo ...
- TwinCAT 3中基于UDP协议通讯的C++实现
因为项目需要,学习了TwinCAT3中使用UDP协议进行通讯的基本知识.这个做个简单的笔记,方便以后查询. 1 概述 倍福为了实现从实时环境中直接访问网卡(network cards)专门提供了一个函 ...
- SQL 查找存在某内容的存储过程
--查找存在某表名的存储过程 SELECT distinct b.name from syscomments a,sysobjects b WHERE a.id=b.id and a.TEXT LIK ...
- python 批量下载文件
file.txt 的内容为: http://183.xxx.xxx.54:188/my/qqq.ico::qq.exe::0::http://183.xxx.xxx.54:186/my/ddnf.ic ...
- SpringMVC与SpringBoot返回静态页面遇到的问题
1.SpringMVC静态页面响应 package com.sv.controller; import org.springframework.stereotype.Controller; impor ...
- Python之路:画空心矩形
1.if语句中当要判断多个语句成立才能执行语句时候,可以用or(或,只要其中一个成立就可以执行下一条语句)或者and(只要有其中一个不成立就不会执行下一条语句) 2.在Python中range函数会产 ...
- CSUOJ 1638 Continued Fraction
1638: Continued Fraction Time Limit: 1 Sec Memory Limit: 128 MB Description Input Output Sample Inp ...