用第一个串建立后缀自动机。然后别的串在上面跑。从根节点开始。如果当前不能转移,一直移到slink或者根。如果移到根,能匹配长度变为0,否则变为maxlen[能转移的点]+1,再转移。转移完往slink上跑,它们至少都能匹配maxlen,和当前匹配取最小。注意在任何点上匹配长度不超过它能表示的最大长度。

//#pragma comment(linker,"/STACK:1024000000,1024000000")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#include <fstream>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF,mod=;
int cnt,trans[SZ][],slink[SZ],maxlen[SZ];
int minlen[SZ],n,arr[SZ],ans[SZ];
//sadcsadsadasdasdsadsadasdasdsadasd
//aabba int add(int pre,int cur)
{
int z=++cnt;
int u=pre;
for(;u!=-&&!trans[u][cur];u=slink[u])
{
trans[u][cur]=z;
}
if(u==-)
{
//cout<<"kind: "<<1<<endl;
maxlen[z]=maxlen[pre]+;
minlen[z]=;
slink[z]=;
}
else
{
int x=trans[u][cur];
//if(pre==8)cout<<pre<<"here"<<x<<endl;
if(maxlen[x]==maxlen[u]+)
{
maxlen[z]=maxlen[pre]+;
minlen[z]=maxlen[x]+;
slink[z]=x;
}
else
{
int y=++cnt;
memcpy(trans[y],trans[x],sizeof(trans[x]));
maxlen[y]=maxlen[u]+;
minlen[y]=maxlen[slink[x]]+;
slink[y]=slink[x];
maxlen[x]=maxlen[x];
minlen[x]=maxlen[y]+;
slink[x]=y;
maxlen[z]=maxlen[pre]+;
minlen[z]=maxlen[y]+;
slink[z]=y;
for(;u!=-&&trans[u][cur]==x;u=slink[u])
{
trans[u][cur]=y;
}
}
}
return z;
} int maxv[SZ],tmp[SZ];
bool vst[SZ]; void init()
{
cin>>n;
for(int i=;i<n;++i)
{
int sz;
cin>>sz;
for(int i=;i<=sz;++i)cin>>arr[i];
for(int i=sz;i>=;--i)arr[i]-=arr[i-]-;
if(i==)
{
int pre=;
memset(slink,-,sizeof(slink));
for(int i=;i<=sz;++i)
{
pre=add(pre,arr[i]);
}
for(int i=;i<=cnt;++i)maxv[i]=INF;
}
else
{
memset(vst,,sizeof(vst));
memset(tmp,,sizeof(tmp));
int u=,it=;
for(int i=;i<=sz;++i)
{
int cur=arr[i];
for(;u!=-&&trans[u][cur]==;u=slink[u]);
if(u==-)
{
u=;
it=;
}
else
{
it=min(it,maxlen[u]);
u=trans[u][cur];
++it;
tmp[u]=max(tmp[u],it);
if(!vst[u])++ans[u];
//cout<<"u: "<<u<<" "<<tmp[u]<<endl;
vst[u]=;
int w=slink[u];
for(;w!=-;w=slink[w])
{
if(!vst[w])++ans[w],vst[w]=;
tmp[w]=max(tmp[w],min(it,maxlen[w]));
}
}
}
for(int i=;i<=cnt;++i)
{
//cout<<"tmp[i]: "<<tmp[i]<<endl;
maxv[i]=min(maxv[i],tmp[i]);
}
}
}
int res=;
for(int i=;i<=cnt;++i)
{
//cout<<"i: "<<i<<" "<<ans[i]<<" "<<maxv[i]<<endl;
if(ans[i]==n-&&maxv[i]!=INF)
{
res=max(res,maxv[i]);
}
}
cout<<res+<<endl;
} void work()
{ } int main()
{
//std::ios::sync_with_stdio(0);
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//cout<<casenum<<endl;
//for(lon time=1;time<=casenum;++time)
//for(lon time=1;cin>>n,n;++time)
{
init();
work();
}
return ;
}
/*
3
5 0 0 1 1 1
5 1 0 0 1 1
5 1 0 1 1 1 5
5 1 1 1 1 1
5 1 1 1 1 1
5 1 1 1 1 1
5 1 1 1 1 1
5 1 1 1 1 1 3
8 0 0 1 1 0 0 1 1
8 0 1 1 0 1 0 1 1
8 1 1 1 1 1 0 1 1 3
6 0 0 1 1 0 0
6 0 1 1 0 1 0
6 1 1 1 1 1 0 3
5 0 1 1 0 0
5 1 1 0 1 0
5 1 1 1 1 0 3
4 1 1 0 0
4 1 0 1 0
4 1 1 1 0 3
4 1 1 0 0
4 1 1 1 1
4 1 1 0 1
*/

「SDOI2008」Sandy 的卡片的更多相关文章

  1. LG2463/BZOJ4698 「SDOI2008」Sandy的卡片 后缀数组

    问题描述 LG2463 BZOJ4698 题解 看到\(n\)个数串,一开始不太好处理,可以很容易想到把这\(n\)个数串连到一起,形成一个大串,但是每个串之间不容易处理. 经过思考,想到在每个串中间 ...

  2. B【SDOI2008】Sandy的卡片

    时间限制 : 5000 MS   空间限制 : 128000 KB 问题描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片 ...

  3. 「SDOI2008」洞穴勘测

    题目链接 戳我 \(Solution\) \(LCT\)裸题 \(Connect\)操作,执行\(link(u,v)\) \(Destroy\)操作,执行\(cut(u,v)\) \(Query\)操 ...

  4. [SDOI2008][luogu2463] Sandy的卡片 [kmp]

    题面 传送门 思路 这道题里面有三个主要问题: 1.由"数值相等"变成了"加上一个整数以后数值相等"(减去等价于加负数) 2.由"最多匹配多少位(从第 ...

  5. BZOJ 4698: Sdoi2008 Sandy的卡片

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

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

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

  7. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

  8. bzoj4698 / P2463 [SDOI2008]Sandy的卡片

    P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...

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

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

随机推荐

  1. git初学

    git在团队合作开发时是很有用的,SVN是集中式的代表,而git是分布式的代表,它分为代码区.暂存区.和本地库.在同一个团队中开发时,在代码存储中心(例如,码云.github)上创建一个库,用于储存和 ...

  2. noip模拟【array】

    array by ysy [题目描述] 给定一个长度为n的数列,每次你可以进行以下操作之一: (1)将一个数+a: (2)将一个数-a: (3)将一个数+b: (4)将一个数-b: 你需要将所有数全部 ...

  3. 【20K必备知识点】北上广Java开发月薪20K往上,该如何做,需要会写什么

    有人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭,其他地方也很难 ...

  4. Bytom资产发行与部署合约教程

    比原项目仓库: Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom 发行资产 ...

  5. x=x+1,x+=1,及x++的效率哪个最高,为什么?

    x=x+1: 1.     读取右X的地址 2.     X+1 3.     读取左X的地址 4.     将右值传给左边的X x+=1: 1.     读取右边的x的地址 2.     X+1 3 ...

  6. Transaction

    SqlTransaction——事务详解 事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态.在事务处理术语中,事务要么提交,要么中止.若要提交事务,所有参与者都必须保证对数据的任 ...

  7. 良品铺子:“新零售”先锋的IT必经之路

    良品铺子:“新零售”先锋的IT必经之路 云计算 大数据 CIO班 CIO 互联网+ 物联网 电子政务 2017-12-29 09:25:34  来源:互联网抢沙发 摘要:2017年被称为“新零售”元年 ...

  8. 给 layui upload 带每个文件的进度条, .net 后台代码

    1.upload.js 扩展 功能利用ajax的xhr属性实现该功能修改过modules中的upload.js文件功能具体实现:在js文件中添加监听函数 //创建监听函数 var xhrOnProgr ...

  9. Python 学习笔记 多进程 multiprocessing--转载

    本文链接地址 http://quqiuzhu.com/2016/python-multiprocessing/ Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时 ...

  10. gulp常用方法

    var gulp = require('gulp'); var concat = require('gulp-concat'); //使用gulp-concat合并文件,减少网络请求(静态资源数量): ...