差分之后就是求多串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. 暑假集训——cf热身赛部分题有感加其题解

    刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...

  2. 并查集入门--畅通工程(HDU1232)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    M ...

  3. appcan UI

    appcan UI 公共类 ([appcanUI框架地址:](http://newdocx.appcan.cn/UI/source) .ub { display: -webkit-box !impor ...

  4. vue清空input file

    input file是只读的,给form一个id,用form.reset()干掉里面input的值 document.getElementById("uploadForm")&am ...

  5. Python 编码问题:出现中文乱码-- (转)

    问题描述: 在写Python代码的过程中,有用到需要输出中文的地方(python2.6.5在中文注释的地方就会出错),但是运行后会出错 我的错误显示: SyntaxError: Non-ASCII c ...

  6. http状态响应码对照表

    1xx - 信息提示   这些状态代码表示临时的响应.客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应.    ·0 - 本地响应成功.   · 100 - Continue 初始的请求已 ...

  7. javascript性能

    1.js文件放在底部 js文件具有阻塞机制,放在头部,需要等待js下载解析完毕之后才能下载渲染页面,因此需要放在底部

  8. 【转】jpg文件格式详解

    JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写.它由国际电话与电报咨询委员会CCITT(The International Telegraph ...

  9. java基础 运算符

    算数运算符 加号:在操作数值.字符.字符串时其结果是不同的,当两个字符相加得到的是ASCII码表值, 当两个字符串相加时表示将两个字符串连接在一起,从而组成新的字符串. 除号:整数在使用除号操作时,得 ...

  10. Django===django工作流

    通过一张图来总结一下Django 的处理过程: URL 组成: 协议类型: HTTP/HTTPS HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW ...