SP8093 JZPGYZ - Sevenk Love Oimaster

题目大意

给定\(n(n\le 10000)\)个模板串,以及\(m(m\le 60000)\)个查询串(模板串总长\(\le 100000\),询问串总长\(\le 360000\))

依次查询每一个查询串是多少个模板串的子串


先对模板串建广义SAM(每次新串las=1的那种)

然后考虑每个点都有一个所属的模板串,它可以对par树上到跟的那条链产生贡献,可以暴力加,据说均摊\(O(n\sqrt n)\),不清楚...

反正是链的问题,不如直接转换成子树问题。

然后发现询问就变成了查询某个点子树和,放到dfs序上发现是区间数颜色,可以离线

于是像HH的项链那样直接树状数组维护一下就可以了。


Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=2e5+10;
int len[N],par[N],ch[N][26],col[N],id,tot=1,las=1;
void extend(int c)
{
int now=++tot,p=las;
len[now]=len[p]+1,col[now]=id;
while(p&&!ch[p][c]) ch[p][c]=now,p=par[p];
if(!p) par[now]=1;
else
{
int x=ch[p][c];
if(len[x]==len[p]+1) par[now]=x;
else
{
int y=++tot;
len[y]=len[p]+1,par[y]=par[x],col[y]=id;
memcpy(ch[y],ch[x],sizeof ch[x]);
while(p&&ch[p][c]==x) ch[p][c]=y,p=par[p];
par[now]=par[x]=y;
}
}
las=now;
}
int head[N],to[N],Next[N],cnt;
void add(int u,int v)
{
to[++cnt]=v,Next[cnt]=head[u],head[u]=cnt;
}
int dfn[N],low[N],ha[N],dfsclock;
void dfs(int now)
{
ha[dfn[now]=++dfsclock]=now;
for(int i=head[now];i;i=Next[i]) dfs(to[i]);
low[now]=dfsclock;
}
struct node
{
int id,l,r;
node(){}
node(int id,int l,int r){this->id=id,this->l=l,this->r=r;}
bool friend operator <(node n1,node n2){return n1.r<n2.r;}
}q[N];
int n,m,m_,pre[N],su[N],ans[N];
char s[N];
void modify(int x,int d){while(x<=dfsclock)su[x]+=d,x+=x&-x;}
int query(int x){int s=0;while(x)s+=su[x],x-=x&-x;return s;}
int main()
{
scanf("%d%d",&n,&m);
for(id=1;id<=n;id++)
{
scanf("%s",s+1);
las=1;int k=strlen(s+1);
for(int j=1;j<=k;j++) extend(s[j]-'a');
}
for(int i=2;i<=tot;i++) add(par[i],i);
dfs(1);
for(int i=1;i<=m;i++)
{
scanf("%s",s+1);
int now=1,k=strlen(s+1);
for(int j=1;j<=k;j++)
{
now=ch[now][s[j]-'a'];
if(!now) break;
}
if(now) q[++m_]=node(i,dfn[now],low[now]);
}
std::sort(q+1,q+1+m_);
for(int j=1,i=1;i<=dfsclock;i++)
{
int color=col[ha[i]];
if(pre[color]) modify(pre[color],-1);
modify(pre[color]=i,1);
while(j<=m_&&q[j].r<=i) ans[q[j].id]=query(q[j].r)-query(q[j].l-1),++j;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

2019.1.10

SP8093 JZPGYZ - Sevenk Love Oimaster 解题报告的更多相关文章

  1. SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)

    题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ...

  2. SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)

    /* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...

  3. SP8093 JZPGYZ - Sevenk Love Oimaster

    传送门 广义后缀自动机-- 其实也不是很难理解,就是每次SAM插入一个串之后,插入新的串的时候,要把last重新调到1的位置,共用一些节点. 这个题我们首先要预处理出来每个状态被多少个串共用.挺暴力的 ...

  4. 【洛谷 SP8093】 JZPGYZ - Sevenk Love Oimaster(后缀自动机)

    题目链接 广义sam.. #include <cstdio> #include <cstring> #include <algorithm> using names ...

  5. SPOJ 8093 JZPGYZ - Sevenk Love Oimaster

    思路 可以用复杂度不对的做法水过去 相当于求parent树子树中的颜色种数,可以离线后树状数组(HH的项链,询问右端点排序之后维护last),dsu on tree,莫队都可以 但是也可以记录每个点上 ...

  6. SPOJ8093【JZPGYZ - Sevenk Love Oimaster】

    怎么全是广义后缀自动机,我\(AC\)自动机不服 这道题可以使用的算法很多,\(SA\)或者\(SAM\)应该都可以 但是我都不会 但是这毕竟是一个多串匹配问题,\(AC\)自动机还是可以刚一刚的 我 ...

  7. BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster [广义后缀自动机]

    JZPGYZ - Sevenk Love Oimaster     Oimaster and sevenk love each other.       But recently,sevenk hea ...

  8. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  9. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

随机推荐

  1. EZ 2018 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...

  2. 在sourceinsight中添加快速注释 Ctrl+/

    1.搜索文件:utils.em(C:\Program Files (x86)\Source Insight 3)2.用sourceinsight打开文件:utils.em3.在文件末尾添加下面代码 m ...

  3. Zabbix实战-简易教程--大型分布式监控系统实现Agent批量快速接入

    一.分布式架构 相信使用zabbix的大神都熟悉他的分布式架构,分布式的优势相当明显,分而治之.比如目前我的架构图如下: 那么,对将要接入监控系统的任何一个agent如何快速定位,并进行接入呢?  问 ...

  4. 设计模式 笔记 桥接模式 Bridge

    //---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...

  5. 如何安装ipa文件(二)

    第一篇文章请看: http://www.cnblogs.com/BK-12345/p/6000124.html 写第二篇的目的是因为iTunes更新了,有一些东西发生了变化,应用没有了,其实还是存在的 ...

  6. JNI探秘-----FileInputStream的read方法详解

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章我们已经分析过File ...

  7. Shell 基础 -- 流编辑器 sed 详解

    一.流编辑器 sed 与命令 sed Linux 中,常使用流编辑器 sed 进行文本替换工作.与常使用的交互式编辑器(如vim)不同,sed 编辑器以批处理的方式来编辑文件,这比交互式编辑器快得多, ...

  8. hyperledger-fabirc1.2-ca-server的生产示例

    hyperledger-fabirc1.2-ca-server的生产示例,带TLS 在fabirc-samples/first-network中启动网络,其ca证书是利用crypto的工具生成的,但是 ...

  9. PAT甲题题解-1067. Sort with Swap(0,*) (25)-贪心算法

    贪心算法 次数最少的方法,即:1.每次都将0与应该放置在0位置的数字交换即可.2.如果0处在自己位置上,那么随便与一个不处在自己位置上的数交换,重复上一步即可.拿样例举例:   0 1 2 3 4 5 ...

  10. THE LAST ONE!! 2017《面向对象程序设计》课程作业八

    THE LAST ONE!! 2017<面向对象程序设计>课程作业八 031602230 卢恺翔 GitHub传送门 题目描述 1.时间匆匆,本学期的博客作业就要结束了,是否有点不舍,是否 ...