[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)
差分之后就是求多串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转移最长长度即可。
#include<map>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=;
int n,m,x,len,fir,lst=,cnt=,ans,res[N],s[N],f[N],mx[N],fa[N],c[N],q[N];
map<int,int>son[N]; void ext(int c){
int p=lst,np=lst=++cnt; mx[np]=mx[p]+;
while (p && !son[p][c]) son[p][c]=np,p=fa[p];
if (!p) fa[np]=;
else{
int q=son[p][c];
if (mx[q]==mx[p]+) fa[np]=q;
else{
int nq=++cnt; mx[nq]=mx[p]+; son[nq]=son[q];
while (p && son[p][c]==q) son[p][c]=nq,p=fa[p];
fa[nq]=fa[q]; fa[q]=fa[np]=nq;
}
}
} void Radix(){
rep(i,,cnt) c[mx[i]]++;
rep(i,,cnt) c[i]+=c[i-];
for (int i=cnt; i; i--) q[c[mx[i]]--]=i;
rep(i,,cnt) res[i]=mx[i];
} void Go(int s[],int n){
int x=,len=;
rep(i,,n){
int c=s[i];
if (son[x][c]) x=son[x][c],f[x]=max(f[x],++len);
else{
while (x && !son[x][c]) x=fa[x];
if (!x) x=,len=; else len=mx[x]+,x=son[x][c],f[x]=max(f[x],len);
}
}
for (int i=cnt; i; i--){
int x=q[i]; res[x]=min(res[x],f[x]);
if (f[x] && fa[x]) f[fa[x]]=mx[fa[x]];
f[x]=;
}
} int main(){
scanf("%d%d%d",&n,&len,&fir);
rep(i,,len-) scanf("%d",&x),s[i]=x-fir,fir=x;
len--; rep(i,,len) ext(s[i]);
Radix();
rep(i,,n){
scanf("%d%d",&len,&fir);
rep(i,,len-) scanf("%d",&x),s[i]=x-fir,fir=x;
len--; Go(s,len);
}
rep(i,,cnt) ans=max(ans,res[i]);
printf("%d\n",ans+);
return ;
}
[BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)的更多相关文章
- BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]
4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...
- BZOJ4698: Sdoi2008 Sandy的卡片(后缀数组 二分)
题意 题目链接 Sol 不要问我为什么发两篇blog,就是为了骗访问量 后缀数组的也比较好想,先把所有位置差分,然后在height数组中二分就行了 数据好水啊 // luogu-judger-enab ...
- 【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ
[BZOJ4698]Sdoi2008 Sandy的卡片 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡 ...
- 【BZOJ-4698】Sandy的卡片 后缀数组
4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 140 Solved: 55[Submit][Stat ...
- [bzoj4698][Sdoi2008]Sandy的卡片_后缀数组_二分/单调队列_双指针
Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$ ...
- 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...
- BZOJ 4698: Sdoi2008 Sandy的卡片 后缀数组 + RMQ + 查分
题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...
- BZOJ4698: Sdoi2008 Sandy的卡片
差分,枚举一个串的所有后缀,暴力在所有其他串中kmp,复杂度$O(nm^2)$. #include<cstdio> const int N=1005; const int M=105; i ...
- SDOI2008 Sandy的卡片( 后缀数组 )
求出后缀数组, 然后二分答案, 对height数组分组检验答案. 时间复杂度O(|S| log|S|) ------------------------------------------------ ...
随机推荐
- HihoCoder 重复旋律
あの旋律を何度も繰り返しでも.あの日見た光景を再現できない 无论将那段旋律重复多少次,也无法重现那一日我们看到的景象 もし切ないならば.時をまきもどしてみるかい? 若是感到惆怅的话,要试着让时光倒流吗 ...
- 转载 JAVA SE 连接ACCESS
本代码实现连接 本机数据库的方法. 操作步骤: 1.进入控制面板,打开“管理工具→数据源(ODBC)”,弹出“ODBC数据源管理器”,在“用户DSN”选项卡中,单击选中名称为“Visio Databa ...
- TensorFlow两种方式计算Cross Entropy
sparse_softmax_cross_entropy_with_logits与softmax_cross_entropy_with_logits import tensorflow as tf y ...
- 通过call_usermodehelper()在内核态执行用户程序【转】
转自:http://edsionte.com/techblog/archives/category/linux%E5%86%85%E6%A0%B8%E7%BC%96%E7%A8%8B 背景 如何在Li ...
- 64_g2
gettext-libs-0.19.8.1-9.fc26.x86_64.rpm 15-Mar-2017 14:15 305038 gf2x-1.1-9.fc26.i686.rpm 11-Feb-201 ...
- hadoop 安装 错误及解决方法
1.ssh 相关问题: rm ~/.ssh/known_hosts //与ssh中的不服 //再重新生成密钥 2.ERROR namenode.NameNode: java.io.IOExceptio ...
- tableView选中行的调用顺序/ 取消选中Cell
UITableViewCell它有两个属性highLighted.selected.很明显一个是高亮状态, 一个是选中状态. UITableViewCell, 对应的2个方法 // 高亮状态调用的方法 ...
- [LabVIEW架构]ActorFramework(一)
前言 小黑结婚回来第二周了,每天忙于程序设计,时间比较紧张,所以文章一直没出来,也算憋大招了. 近期小黑将与大家一起认识一下ActorFramework,既是对自己一段时间写AF程序的总结,也是梳理, ...
- python库-urllib
urllib库提供了一系列操作url的功能,是python处理爬虫的入门级工具,网上的学习资料也很多.我做爬虫是一开始就用了Scrapy框架,并不是一步步从urllib开始的,反而是在后来解决一些小问 ...
- ZOJ-3430
Detect the Virus Time Limit: 2 Seconds Memory Limit: 65536 KB One day, Nobita found that his c ...