题目链接

\(Description\)

对于每个串,求在\(n\)个串中只在该串中出现过的子串的数量。

\(Solution\)

建广义SAM。对每个串插入时新建的np标记其属于哪个串。

然后在parent树上DFS,合并子节点状态就行了。

每个点的贡献就是\(len[i]-len[fa[i]]\)。

因为这样的广义SAM不是很正规吧,直接按拓扑序倒序递推是错的。(见评论 https://www.cnblogs.com/cjyyb/p/9100377.html)

//26700kb	244ms
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=2e5+5; struct Suffix_Automaton
{
int tot,las,son[N][26],len[N],fa[N],bel[N],Enum,H[N],nxt[N],to[N];
char s[N>>1];
long long ans[N>>1]; #define AE(u,v) to[++Enum]=v,nxt[Enum]=H[u],H[u]=Enum
Suffix_Automaton() {tot=las=1;}
void Insert(int c,int id)
{
int np=++tot,p=las;
len[las=np]=len[p]+1, bel[np]=id;
for(; p&&!son[p][c]; p=fa[p]) son[p][c]=np;
if(!p) fa[np]=1;
else
{
int q=son[p][c];
if(len[q]==len[p]+1) fa[np]=q;
else
{
int nq=++tot; len[nq]=len[p]+1;
memcpy(son[nq],son[q],sizeof son[q]);
fa[nq]=fa[q], fa[q]=fa[np]=nq;
for(; son[p][c]==q; p=fa[p]) son[p][c]=nq;
}
}
}
void Build(int id)
{
las=1; scanf("%s",s);
for(int i=0,l=strlen(s); i<l; ++i) Insert(s[i]-'a',id);
}
void DFS(int x)
{
for(int i=H[x]; i; i=nxt[i]) DFS(to[i]);
for(int i=H[x],v; i; i=nxt[i])
{
if(!bel[v=to[i]]) {bel[x]=0; break;}
if(!bel[x]) bel[x]=bel[v];
else if(bel[x]!=bel[v]) {bel[x]=0; break;}
}
}
void Solve(int n)
{
for(int i=2; i<=tot; ++i) AE(fa[i],i);
DFS(1);
for(int i=2; i<=tot; ++i) if(bel[i]) ans[bel[i]]+=len[i]-len[fa[i]];
for(int i=1; i<=n; ++i) printf("%lld\n",ans[i]);
}
}sam; int main()
{
int n; scanf("%d",&n);
for(int i=1; i<=n; ++i) sam.Build(i);
sam.Solve(n);
return 0;
}

BZOJ.5137.Standing Out from the Herd(广义后缀自动机)的更多相关文章

  1. BZOJ5137: [Usaco2017 Dec]Standing Out from the Herd(广义后缀自动机,Parent树)

    Description Just like humans, cows often appreciate feeling they are unique in some way. Since Farme ...

  2. 【BZOJ5137】Standing Out from the Herd(后缀自动机)

    [BZOJ5137]Standing Out from the Herd(后缀自动机) 题面 BZOJ 洛谷 题解 构建广义后缀自动机 然后对于每个节点处理一下它的集合就好了 不知道为什么,我如果按照 ...

  3. 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 ...

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

    给定n个串m个询问,问每个串在n个串多少个串中出现了. 构建广义后缀自动机,(就是把所有字符串的后缀自动机合并起来)其实只需要add的时候注意一下就可以了. 然后对于每一个串,跑一边匹配,到达了now ...

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

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

  6. BZOJ 3926 && ZJOI 2015 诸神眷顾的幻想乡 (广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MB Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽 ...

  7. BZOJ 3277 串 (广义后缀自动机)

    3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...

  8. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  9. BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(广义后缀自动机)

    题目链接 \(Description\) 给定n个模式串,多次询问一个串在多少个模式串中出现过.(字符集为26个小写字母) \(Solution\) 对每个询问串进行匹配最终会达到一个节点,我们需要得 ...

随机推荐

  1. SpringBoot集成SpringCloud

    (1).新建一个普通Maven项目,用于存放一些公共服务接口及公共的Bean等. 项目结构: 公共Bean: package cn.coreqi.entities; import java.io.Se ...

  2. 转载CSDN博客步骤

    在参考“如何快速转载CSDN中的博客”后,由于自己不懂html以及markdown相关知识,所以花了一些时间来弄明白怎么转载博客,以下为转载CSDN博客步骤和一些知识小笔记. 参考博客原址:http: ...

  3. javascript中cookie常用操作

    //写cookies function setCookie(c_name, value, expiredays){ var exdate=new Date(); exdate.setTime(exda ...

  4. Hyper-V虚拟机上安装一个图形界面的Linux系统

    这件事情呢,一直想干但又觉得太陌生和麻烦,无奈现在到了非装不可的时候,只好硬着头皮去装.在此之前,我不懂什么叫做虚拟机,linux也接触甚少.经过3天的折腾,终于装好了带有图形界面的linux(字符版 ...

  5. 解决walle报错:宿主机代码检出检测出错,请确认svn用户名密码无误

    使用walle检测报错: 查看日志 # tail -f /tmp/walle/walle-20161010.log 报错: 2016-10-10 14:20:30 -- --------------- ...

  6. mysql数据库基于LVM快照的备份

    lvm-snapshot: 基于LVM快照的备份 1.事务日志跟数据文件必须在同一个卷上          2.创建快照卷之前,要请求mysql的全局锁,在快照创建完成之后释放锁          3 ...

  7. Android通讯:通话

    Android通讯之通话功能的实现: 在Android中,android.telephony.TelephonyManager对象是开发者获取当前通话网络相关信息的窗口,通过TelephonyMana ...

  8. SqlServer 2017 下载地址及密钥

    下载地址: ed2k://|file|cn_sql_server_2017_developer_x64_dvd_11296175.iso|1769777152|E21AE7C3576C0BDF1BC0 ...

  9. cf220b

    不知道为什么线段树区间更新专题里有这题.. 可以用莫队解,也可以直接开数组解 /* n个询问,m个元素 O(m*m):记录每个元素出现次数,筛掉出现次数小于数值的数 */ #include<io ...

  10. 线程使用中常见的错误-“System.InvalidOperationException”线程间操作无效: 从不是创建控件“ ”的线程访问它。

    “System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 线程间操作无效: 从不是创建控件“la ...