用第一个串建立后缀自动机。然后别的串在上面跑。从根节点开始。如果当前不能转移,一直移到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. MongoDB的C#驱动报错Server instance 127.0.0.1:27017 is no longer connected的解决方案

    使用C#的MondoDB驱动,一直没问题.结果最近,MongoCursor的ToList方法,取列表,总是报错 Server instance 127.0.0.1:27017 is no longer ...

  2. QWidget设置背景图

    1.使用QSS出现很多问题 2.方法 this->setAutoFillBackground(true); QPalette palette = this->palette(); pale ...

  3. codevs1048石子归并

    codevs1048 石子归并  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 传送门  http://codevs.cn/problem/1048/ 题目描述 ...

  4. 微生物增殖|2012年蓝桥杯B组题解析第一题-fishers

    (3')微生物增殖 假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1 ...

  5. LOJ#2427. 「POI2010」珍珠项链 Beads

    题目地址 题目链接 题解 不会算复杂度真是致命,暴力枚举k每次计算是n/2+n/3+n/4+...+1的,用调和级数算是\(O(nlogn)\)的... 如果写哈希表的话能够\(O(nlogn)\), ...

  6. 【NOIP 2018】Day2 T3 保卫王国

    Problem Description Z 国有\(n\)座城市,\(n - 1\)条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达. Z 国的国防部长小 Z 要在城市 ...

  7. python测试

    [链接]JointhePythonDeveloperscommunityonSlack! http://pythondevelopers.herokuapp.com/

  8. R的极客理想系列文章--转载

    http://blog.fens.me/series-r/ R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在 ...

  9. 【Java】【路径】

    [java中Class.getResource用法(用于配置文件的读取)] 用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的F ...

  10. intellij idea 破解教程

    首先呼吁:抵制盗版,抵制盗版,抵制盗版 如果只是个人开发学习用,那么下面的教程可能比较适合你了 有两种方法,第一种:Activate--License server,在License server a ...