差分之后就是求多串LCS。

对其中一个串建SAM,然后把其它串放在上面跑。

对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值。答案就是res[]的最大值。

考虑f[x]的求法,把s[]放在SAM上跑时,若下一个能正常匹配(即son[x][c]!=0)则直接len++,否则用经典的跳父亲,找到第一个son[k][c]!=0的点k,len=mx[k]+1,x=son[k][c]。
每次更新最终匹配到的状态的f[]。同时注意到出现次数可以向父亲传递,于是Radixsort之后经典DP转移最长长度即可。

  1. #include<map>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define rep(i,l,r) for (int i=(l); i<=(r); i++)
  6. typedef long long ll;
  7. using namespace std;
  8.  
  9. const int N=;
  10. int n,m,x,len,fir,lst=,cnt=,ans,res[N],s[N],f[N],mx[N],fa[N],c[N],q[N];
  11. map<int,int>son[N];
  12.  
  13. void ext(int c){
  14. int p=lst,np=lst=++cnt; mx[np]=mx[p]+;
  15. while (p && !son[p][c]) son[p][c]=np,p=fa[p];
  16. if (!p) fa[np]=;
  17. else{
  18. int q=son[p][c];
  19. if (mx[q]==mx[p]+) fa[np]=q;
  20. else{
  21. int nq=++cnt; mx[nq]=mx[p]+; son[nq]=son[q];
  22. while (p && son[p][c]==q) son[p][c]=nq,p=fa[p];
  23. fa[nq]=fa[q]; fa[q]=fa[np]=nq;
  24. }
  25. }
  26. }
  27.  
  28. void Radix(){
  29. rep(i,,cnt) c[mx[i]]++;
  30. rep(i,,cnt) c[i]+=c[i-];
  31. for (int i=cnt; i; i--) q[c[mx[i]]--]=i;
  32. rep(i,,cnt) res[i]=mx[i];
  33. }
  34.  
  35. void Go(int s[],int n){
  36. int x=,len=;
  37. rep(i,,n){
  38. int c=s[i];
  39. if (son[x][c]) x=son[x][c],f[x]=max(f[x],++len);
  40. else{
  41. while (x && !son[x][c]) x=fa[x];
  42. if (!x) x=,len=; else len=mx[x]+,x=son[x][c],f[x]=max(f[x],len);
  43. }
  44. }
  45. for (int i=cnt; i; i--){
  46. int x=q[i]; res[x]=min(res[x],f[x]);
  47. if (f[x] && fa[x]) f[fa[x]]=mx[fa[x]];
  48. f[x]=;
  49. }
  50. }
  51.  
  52. int main(){
  53. scanf("%d%d%d",&n,&len,&fir);
  54. rep(i,,len-) scanf("%d",&x),s[i]=x-fir,fir=x;
  55. len--; rep(i,,len) ext(s[i]);
  56. Radix();
  57. rep(i,,n){
  58. scanf("%d%d",&len,&fir);
  59. rep(i,,len-) scanf("%d",&x),s[i]=x-fir,fir=x;
  60. len--; Go(s,len);
  61. }
  62. rep(i,,cnt) ans=max(ans,res[i]);
  63. printf("%d\n",ans+);
  64. return ;
  65. }

[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)的更多相关文章

  1. BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]

    4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...

  2. BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)

    题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...

  3. 【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ

    [BZOJ4698]Sdoi2008 Sandy的卡片 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡 ...

  4. 【BZOJ-4698】Sandy的卡片 后缀数组

    4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 140  Solved: 55[Submit][Stat ...

  5. [bzoj4698][Sdoi2008]Sandy的卡片_后缀数组_二分/单调队列_双指针

    Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$ ...

  6. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...

  7. BZOJ 4698: Sdoi2008 Sandy的卡片 后缀数组 + RMQ + 查分

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

  8. BZOJ4698: Sdoi2008 Sandy的卡片

    差分,枚举一个串的所有后缀,暴力在所有其他串中kmp,复杂度$O(nm^2)$. #include<cstdio> const int N=1005; const int M=105; i ...

  9. SDOI2008 Sandy的卡片( 后缀数组 )

    求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...

随机推荐

  1. HDU 1574 RP问题 (dp)

    题目链接 Problem Description 在人类社会中,任何个体都具有人品,人品有各种不同的形式,可以从一种形式转换为另一种形式,从一个个体传递给另一个个体,在转换和传递的过程中,人品不会消失 ...

  2. hdu 2545 树上战争(并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2545 树上战争 Time Limit: 10000/4000 MS (Java/Others)     ...

  3. hadoop2.4.1伪分布式环境搭建

    注意:所有的安装用普通哟用户安装,所以首先使普通用户可以以sudo执行一些命令: 0.虚拟机中前期的网络配置参考: http://www.cnblogs.com/qlqwjy/p/7783253.ht ...

  4. Java面试基础知识1

    1.动态绑定是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法. 2.在将超类转换为子类之前,应该使用instanceof进行检查. 3.包含一个或者多个抽象方法的类本身必须被声 ...

  5. linux编程之信号

    信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信 ...

  6. Laravel 调试器 Debugbar 和数据库导出利器 DbExporter 扩展安装及注意事项

    一.Debugbar安装 参考:Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程 的“2.安装”部分 二.DbExporter安装 参考:Laravel 扩展推荐 ...

  7. linux===linux后台运行和关闭、查看后台任务(转)

    fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到这个用在一个命令的最后,可以把这个命令放 ...

  8. mongodb 学习笔记 3 --- 查询

    在mongodb的查询中可以通过使用如下操作符进行深度查询 1.条件操作符 $gt  $gte : >  >=   {"age":{"$gt":18 ...

  9. vue 开始开发

    1,引入vue.js文件 2,在body里用标签 编辑一个入口 <div id="app">{{msg}}</div> <-- 用双大括号 取数据显示 ...

  10. centos 7 防火墙设置

    一.介绍 centos 7 的防火墙是以firewalld daemon的形式存在,区别于iptables 二.使用方法 centos7 主要通过firewall-cmd命令来管理firewall, ...