差分后即求多串LCS。先考虑两个串怎么做。对第一个串建SAM,第二个串在上面跑即可,任意时刻走到的节点表示的都是第二个串的当前前缀在第一个串中出现的最长的后缀,具体计算长度时每走一个字符长度+1,跳fail时将长度重设为当前节点maxlen即可。

  扩展到多串,同样对第一个串建SAM,后面每个串在上面跑一遍,每走到一个节点就记录当前匹配长度,每个节点对所有串取min,再在所有节点中找max即可。注意每个串跑完时都要按parent树更新一遍节点的记录值,因为能在某点匹配就一定可以在它的所有父亲处以最长长度匹配。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
#define ll long long
#define N 2010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,a[N][N],cnt=1,last=1,len[N],fail[N],u[N],v[N],id[N];
map<int,int> son[N];
void ins(int c,int n)
{int x=++cnt,p=last;last=x;len[x]=len[p]+1;while (!son[p][c]) son[p][c]=x,p=fail[p];if (!p) fail[x]=1;else{int q=son[p][c];if (len[q]==len[p]+1) fail[x]=q;else{int y=++cnt;len[y]=len[p]+1;son[y]=son[q];fail[y]=fail[q],fail[x]=fail[q]=y;while (son[p][c]==q) son[p][c]=y,p=fail[p];}}
}
void run(int n,int *a)
{memset(v,0,sizeof(v));int k=1,l=0;for (int i=1;i<=n;i++){while (!son[k][a[i]]&&k) k=fail[k],l=len[k];if (!k) k=1,l=0;else l++,k=son[k][a[i]],v[k]=max(v[k],l);}for (int i=1;i<=cnt;i++) if (v[id[i]]) v[fail[id[i]]]=len[fail[id[i]]];for (int i=1;i<=cnt;i++) u[i]=min(u[i],v[i]);
}
bool cmp(const int&a,const int&b)
{return len[a]>len[b];
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4698.in","r",stdin);freopen("bzoj4698.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read();for (int i=1;i<=n;i++){a[i][0]=read();for (int j=1;j<=a[i][0];j++) a[i][j]=read();for (int j=a[i][0];j>=1;j--) a[i][j]-=a[i][j-1];for (int j=1;j<a[i][0];j++) a[i][j]=a[i][j+1];a[i][0]--;}for (int i=1;i<=a[1][0];i++) ins(a[1][i],i);memset(u,42,sizeof(u));for (int i=1;i<=cnt;i++) id[i]=i;sort(id+1,id+cnt+1,cmp);for (int i=2;i<=n;i++) run(a[i][0],a[i]);int ans=0;for (int i=1;i<=cnt;i++) ans=max(ans,min(len[i],u[i]));cout<<ans+1;return 0;
}

  

转载于:https://www.cnblogs.com/Gloid/p/10805790.html

BZOJ4698 SDOI2008Sandy的卡片(后缀自动机)相关推荐

  1. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

  2. 【POJ1509】Glass Beads 【后缀自动机】

    题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...

  3. bzoj 2946 [Poi2000]公共串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...

  4. 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)

    后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...

  5. 洛谷P3966 [TJOI2013]单词(后缀自动机)

    传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...

  6. hihocoder 后缀自动机专题

    一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...

  7. BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)

    Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...

  8. 从零开始の后缀自动机

    后缀自动机,一个处理字符串问题的神器.听起来很神圣,貌似很难写.其实代码实现并不复杂,萌新估计都能学会. 以前听学长们讲过好多次也看过陈立杰的课件,都不是很明白.今天终于弄明白了,就写一个让大家都能看 ...

  9. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

最新文章

  1. OSChina 周一乱弹 —— 把朋友圈的锦鲤全都抓走
  2. (转载)vim括号匹配等跳转技巧
  3. 将Java程序变成可执行文件的简单方法
  4. ICLR 2017 | GAN Missing Modes 和 GAN
  5. oracle 10g 安装介质,如何从Oracle 10g的安装介质中提取BBED必须的sbbdpt.o和ssbbded.o库文件...
  6. 扒一扒.NET Core的环境配置提供程序
  7. Android菜鸟如何学习Android系统开发?
  8. PHP中的中文截取乱码问题_gb2312_utf-8
  9. 指纹对比软件_iQOO VS 小米9屏幕指纹大对决,这次我为vivo疯狂打Call!
  10. 博士在读时,把暗恋的师兄变成了老公是种怎样的体验?
  11. Java 接口基础详解,java开发面试笔试题
  12. python actor_Python定义一个Actor任务
  13. [android]加载大量图片避免OOM
  14. ajax,jsp,java的web应用程序(转)
  15. 5.Entity Framework Core 5.0 查询数据
  16. iTunes只能装C盘吗_就这一篇:教你真正有效地解决爆满的C盘!
  17. 机器学习 | 泰坦尼克号数据集
  18. 龙威PS305D维修案例收集
  19. vue+ elementui合并单元格后 checkbox多选单选取值问题
  20. python每日学4:vscode的安装与基础使用

热门文章

  1. Vue 3开发的重要提示
  2. Dapper的动态查询生成器
  3. php 输出mysql_php如何输出mysql查询结果
  4. java可以看懂php代码吗_可以自己给自己理发吗?看懂这六点细节就能给自己理发了...
  5. css 垂直居中_CSS 水平+垂直居中的方式
  6. python自动化测试环境搭建_selenium+python自动化测试之环境搭建
  7. 小程序分享如何自定义封面?
  8. csv是python内置模块吗_Python--CSV模块 - 一只小小的寄居蟹 - 博客园
  9. phalapi 数据库锁_phalApi数据库操作
  10. linux找回删除的文件6,在Centos6/RHEL6上恢复ext4文件系统下误删除的文件