Spoj8093 Sevenk Love Oimaster
题解:
对于所有n串建广义后缀自动机。
(广义后缀自动机唯一区别就是每次将las附成1,并不需要在插入时特判)
建完后再建出parent树,然后用dfs序+树状数组搞区间不同种类。
其实就是HH的项链+广义后缀自动机。很水的。(虽然我调了半个晚上)
代码:
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100050
int n,q;
char s[];
int ic(char c)
{
if(c>='a'&&c<='z')return c-'a'+;
if(c>='A'&&c<='Z')return c-'A'+;
if(c>=''&&c<='')return c-''+;
if(c==',')return ;
if(c=='.')return ;
return ;
}
int tin[*N],tout[*N],tim,pla[*N];
struct SAM
{
struct node
{
int len,pre,trs[];
vector<int>v;
}p[*N];
int tot,las;
SAM(){tot=las=;}
void res(){las=;}
void insert(int c,int k)
{
int np,nq,lp,lq;
np = ++tot;
p[np].len = p[las].len+;
for(lp=las;lp&&!p[lp].trs[c];lp=p[lp].pre)
p[lp].trs[c]=np;
if(!lp)p[np].pre = ;
else
{
lq = p[lp].trs[c];
if(p[lq].len == p[lp].len+)p[np].pre = lq;
else
{
nq = ++tot;
p[nq] = p[lq];
p[nq].len = p[lp].len+;
p[lq].pre = p[np].pre = nq;
while(p[lp].trs[c]==lq)
{
p[lp].trs[c]=nq;
lp=p[lp].pre;
}
}
}
las = np;
p[las].v.push_back(k);
}
int hed[*N],cnt;
struct EG
{
int to,nxt;
}e[*N];
void ae(int f,int t)
{
e[++cnt].to = t;
e[cnt].nxt = hed[f];
hed[f] = cnt;
}
void dfs(int u)
{
tin[u]=++tim;pla[tim]=u;
for(int j=hed[u];j;j=e[j].nxt)dfs(e[j].to);
tout[u]=tim;
}
void build()
{
for(int i=;i<=tot;i++)
ae(p[i].pre,i);
dfs();
}
}sam;
int ans[],ct;
struct Pair
{
int l,r,id;
}qu[];
bool cmp(Pair a,Pair b)
{
return a.r<b.r;
}
int f[*N];
void up(int x,int d)
{
if(!x)return ;
while(x<=)f[x]+=d,x+=(x&(-x));
}
int down(int x)
{
if(!x)return ;
int ret = ;
while(x)ret+=f[x],x-=(x&(-x));
return ret;
}
int las[];
int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
int len = strlen(s+);
sam.res();
for(int j=;j<=len;j++)
sam.insert(ic(s[j]),i);
}
sam.build();
for(int i=;i<=q;i++)
{
scanf("%s",s+);
int len = strlen(s+);
int u = ;
for(int j=;j<=len&&u;j++)
u=sam.p[u].trs[ic(s[j])];
if(u)
{
ct++;
qu[ct].l = tin[u];
qu[ct].r = tout[u];
qu[ct].id = i;
}
}
sort(qu+,qu++ct,cmp);
for(int k=,i=;i<=tim;i++)
{
for(int j=;j<sam.p[pla[i]].v.size();j++)
{
up(i,);
up(las[sam.p[pla[i]].v[j]],-);
las[sam.p[pla[i]].v[j]]=i;
}
int tmp = down(i);
for(;qu[k].r==i;k++)
ans[qu[k].id] = tmp - down(qu[k].l-);
}
for(int i=;i<=q;i++)
printf("%d\n",ans[i]);
return ;
}
Spoj8093 Sevenk Love Oimaster的更多相关文章
- BZOJ2780:[SPOJ8093]Sevenk Love Oimaster(广义SAM)
Description Oimaster and sevenk love each other. But recently,sevenk heard that a girl named ChuYuXu ...
- BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)
题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...
- [BZOJ2780][SPOJ8093]Sevenk Love Oimaster
bzoj luogu 题面 给定n个模板串,以及m个查询串. 依次查询每一个查询串是多少个模板串的子串. sol 广义后缀自动机裸题? 先建出\(SAM\),然后记录一下每个节点分别在多少个模板串里出 ...
- [bzoj2780][Spoj8093]Sevenk Love Oimaster_广义后缀自动机
Sevenk Love Oimaster bzoj-2780 Spoj-8093 题目大意:给定$n$个大串和$m$次询问,每次给出一个字符串$s$询问在多少个大串中出现过. 注释:$1\le n\l ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分+RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries ...
- BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]
JZPGYZ - Sevenk Love Oimaster Oimaster and sevenk love each other. But recently,sevenk hea ...
- SP8093 JZPGYZ - Sevenk Love Oimaster 解题报告
SP8093 JZPGYZ - Sevenk Love Oimaster 题目大意 给定\(n(n\le 10000)\)个模板串,以及\(m(m\le 60000)\)个查询串(模板串总长\(\le ...
- 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)
[BZOJ2780][SPOJ]Sevenk Love Oimaster(后缀自动机) 题面 BZOJ 洛谷 题解 裸的广义后缀自动机??? 建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括 ...
- 【BZOJ2780】[Spoj]8093 Sevenk Love Oimaster 广义后缀自动机
[BZOJ2780][Spoj]8093 Sevenk Love Oimaster Description Oimaster and sevenk love each other. But r ...
随机推荐
- npm install 各种后缀 --xx说明
npm install xx -g 首先是在npm install xx 命令后面加 -g 它表示将当前包上下文(即,当前工作目录)安装为全局包. npm install (没有参数),在本地node ...
- hadoop wordcount程序缺陷
在wordcount 程序的main函数中,没有读取运行环境中的各种参数的值,全靠hadoop系统的默认参数跑起来,这样做是有风险的,最突出的就是OOM错误. 自己在刚刚学习hadoop编程时,就是模 ...
- jQuery笔记之热点搜索排名小demo
先来看一下成品图: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) ABCD
官方题解: http://www.cnblogs.com/qscqesze/p/6418555.html#3623453 喵哈哈村的魔法石 描述 传说喵哈哈村有三种神奇的魔法石:第一种魔法石叫做人铁石 ...
- 洛谷 P3960 列队
https://www.luogu.org/problemnew/show/P3960 常数超大的treap #pragma GCC optimize("Ofast") #incl ...
- 堆参数-XMS 与-XMX的说明
XMS : JVM初始分配的堆内存 XMX : JVM最大允许分配的堆内存,按需分配 堆内存分配: JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64: JVM最大分配的堆内存由-Xmx指 ...
- 机器学习概念之特征选择(Feature selection)之VectorSlicer算法介绍
不多说,直接上干货! VectorSlicer 算法介绍: VectorSlicer是一个转换器,输入特征向量,输出原始特征向量子集.VectorSlicer接收带有特定索引的向量列,通过对这些索引的 ...
- Spring------自动化装配Bean(二)
上一篇是基于 @ComponentScan自动装配Bean的实现,这一篇将通过java手动装配bean来实现. 手动装配相对于自动装配的优点: 可以自行定义Bean的各个属性. 添加额外的方法调度. ...
- php,json数据传输(无刷新)
废话不说直接上关键代码: js代码: <script language="javascript"> $(".login").live('click' ...
- MVC 下 ajax调用 日期差值计算
背景: 服务项目已有服务期起止时间From-To 现在要根据用户输入的新的起始时间, 和该服务期的原有区间值, 计算出新的服务期截止时间 即 NewServiceToDateTime = NewSer ...