传送门

解题思路

  这个似乎和以前做过的一道题很像,只不过这个是求本质不同子串个数。肯定是先把广义\(SAM\)造出来,然后\(dfs\)时把子节点的信息合并到父节点上,看哪个只被一个串覆盖,\(ans+=l_i-l_{fa_i}\)。这里我比较懒(sha),合并信息直接暴力扔了个\(set\)启发式合并上去的,似乎分类讨论一下就行了,平添\(log\)正是在下。

代码

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<set>
  6. #include<string>
  7. #include<vector>
  8. using namespace std;
  9. const int N=100005;
  10. typedef long long LL;
  11. int n,a[N<<1],c[N<<1],siz[N<<1];
  12. LL ans[N];
  13. set<int> S[N<<1];
  14. vector<int> v[N<<1];
  15. string s[N];
  16. void add(int bg,int ed){
  17. v[bg].push_back(ed);
  18. }
  19. void dfs(int x){
  20. int u;
  21. for(int i=0;i<v[x].size();i++){
  22. u=v[x][i]; dfs(u);
  23. if(x==1) continue;
  24. for(set<int>::iterator it=S[u].begin();it!=S[u].end();it++)
  25. S[x].insert(*it);
  26. }
  27. siz[x]=S[x].size();
  28. }
  29. struct SAM{
  30. int fa[N<<1],ch[N<<1][28],l[N<<1],cnt,lst;
  31. void Insert(int c,int id){
  32. int p=lst,np=++cnt; l[np]=l[p]+1; lst=cnt;
  33. for(;p && !ch[p][c];p=fa[p]) ch[p][c]=np;
  34. if(!p) fa[np]=1;
  35. else {
  36. int q=ch[p][c];
  37. if(l[q]==l[p]+1) fa[np]=q;
  38. else {
  39. int nq=++cnt; l[nq]=l[p]+1;
  40. memcpy(ch[nq],ch[q],sizeof(ch[nq]));
  41. fa[nq]=fa[q]; fa[q]=fa[np]=nq;
  42. for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
  43. }
  44. }
  45. S[np].insert(id);
  46. }
  47. void solve(){
  48. for(int i=1;i<=cnt;i++)
  49. if(fa[i]) add(fa[i],i);
  50. dfs(1);
  51. }
  52. }sam;
  53. int main(){
  54. scanf("%d",&n); int len; sam.cnt=1;
  55. for(int i=1;i<=n;i++){
  56. cin>>s[i]; len=s[i].length(); sam.lst=1;
  57. for(int j=0;j<len;j++) sam.Insert(s[i][j]-'a'+1,i);
  58. }
  59. sam.solve();
  60. for(int i=1;i<=sam.cnt;i++)
  61. if(siz[i]==1) ans[*S[i].begin()]+=sam.l[i]-sam.l[sam.fa[i]];
  62. for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
  63. return 0;
  64. }

BZOJ 5137: [Usaco2017 Dec]Standing Out from the Herd(后缀自动机)的更多相关文章

  1. BZOJ5137[Usaco2017 Dec]Standing Out from the Herd

    看了半天题 不知道怎么用SAM维护 于是借(chao)鉴(xi)的一发神犇的 只要判断这个子串之前被标记的记号(也就是他属于第几个串)和这次转移到的是否相同 如果不同就说明该子串属于多个串 直接标记- ...

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

  3. bzoj 3926: 诸神眷顾的幻想乡 广义后缀自动机

    题目: Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给 ...

  4. UOJ #131 BZOJ 4199 luogu P2178【NOI2015】品酒大会 (后缀自动机、树形DP)

    水是水,但是写出了不少问题,因此写一发博客. https://www.luogu.org/problemnew/show/P2178 https://www.lydsy.com/JudgeOnline ...

  5. BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(后缀自动机)

    传送门 解题思路 因为叶节点不超过\(20\)个,所以可以枚举这些叶节点,并把这些节点当做根扫整棵树.可以证明所有的子串一定可以被便利到,然后可以对这些串建广义后缀自动机.\(dfs\)的时候要记录一 ...

  6. 【BZOJ5138】[Usaco2017 Dec]Push a Box(强连通分量)

    [BZOJ5138][Usaco2017 Dec]Push a Box(强连通分量) 题面 BZOJ 洛谷 题解 这题是今天看到萝卜在做然后他一眼秒了,我太菜了不会做,所以就来做做. 首先看完题目,是 ...

  7. BZOJ5142: [Usaco2017 Dec]Haybale Feast(双指针&set)(可线段树优化)

    5142: [Usaco2017 Dec]Haybale Feast Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 182  Solved: 131[ ...

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

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

  9. 后缀自动机SAM BZOJ 2806

    终于遇到了一道后缀数组不能过 一定要学SAM的题... (看了半个下午+半个上午) 现在总结一下(是给我自己总结..所以只总结了我觉得重要的 .. 看不太懂的话可以To   http://blog.c ...

随机推荐

  1. LinkedList 源码解读

    LinkedList 源码解读 基于jdk1.7.0_80 public class LinkedList<E> extends AbstractSequentialList<E&g ...

  2. php-fpm的执行方式 (进程管理模式)

    php-fpm的进程数可以根据设置分为动态和静态. 静态:直接开启指定数量的php-fpm进程,不再增加或者减少: 动态:开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加ph ...

  3. Spring cloud 注册服务小结

    服务注册中心:Eureka.Zookeeper.Cousul.Nacos 使用RestTemplate.openFeign做服务调用,底层使用的是Ribbon. Ribbon做了负载均衡,也可以做一个 ...

  4. 中标麒麟V6.0安装 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz

    在中标麒麟6.0上安装mysql, 1.先从官网(https://dev.mysql.com/downloads/mysql/5.7.html#downloads)下载 . 我的选择如上图. 2.下载 ...

  5. go 结构体取代类

    我们知道go的结构体有点类的感觉,可以有自己的属性和方法. 但是由于结构体的属性都是有零值的,我们在创建结构体的时候并不需要设置这些属性的值就能创建,但是这样创建的结构体往往没有什么实用价值. 我们可 ...

  6. windows与linux安装Python虚拟环境

    我这里觉得还是一步到位用virtualenvwrapper  工具,不再讲述virtualenv了,有了工具很好用 windows : 首先安装工具 pip install virtualenvwra ...

  7. 【JAVA】 05-String类和JDK5

    链接: 笔记目录:毕向东Java基础视频教程-笔记 GitHub库:JavaBXD33 目录: <> <> 内容待整理: API-String 特点 String类: 1.St ...

  8. XMPP即时通讯协议使用(四)——Openfire服务器源码编译与添加消息记录保存

    下载Openfire源码 下载地址:https://www.igniterealtime.org/downloads/index.jsp,当前最新版本为:4.2.3 Eclipse上部署Openfir ...

  9. Solr的学习使用之(一)部署

    Solr的主要功能是全文检索,该功能分为两个过程:创建索引和对索引进行搜索 一.心得体会 第一次写技术博客,这次写的基本上都是从网络上整理的来的,外加自己的一些实践,以后争取全部原创哈,都说写技术博客 ...

  10. openstack stein部署手册 2. 基础应用

    1. chrony # 安装程序包 yum install -y chrony # 变更配置文件 /etc/chrony.conf 增加 server 192.168.123.200 iburst # ...