luoguP2463 [SDOI2008]Sandy的卡片
题意
显然加上一个数相等就是差分数组相等,于是问题变为求几个串的最长公共子串。
这里我学习了如何用SA求LCS。
首先问题要转化成求一些后缀的最长公共前缀,要求这些后缀分属不同的串。
于是二分答案,于是问题就变成求一段连续的\(height\)数组,它们都\(\geqslant mid\),并且至少分属\(n\)个串,显然可以\(O(n)\)扫一遍得出。
code:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,num,K;
int a[maxn],b[maxn],pos[maxn];
int sa[maxn],rk[maxn],oldrk[maxn],id[maxn],tmpid[maxn],cnt[maxn],height[maxn];
bool vis[maxn];
inline bool cmp(int x,int y,int k){return oldrk[x]==oldrk[y]&&oldrk[x+k]==oldrk[y+k];}
inline void sa_build()
{
num=3000;
for(int i=1;i<=n;i++)cnt[rk[i]=a[i]]++;
for(int i=1;i<=num;i++)cnt[i]+=cnt[i-1];
for(int i=n;i;i--)sa[cnt[rk[i]]--]=i;
for(int t=1;t<=n;t<<=1)
{
int tot=0;
for(int i=n-t+1;i<=n;i++)id[++tot]=i;
for(int i=1;i<=n;i++)if(sa[i]>t)id[++tot]=sa[i]-t;
tot=0;
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++)cnt[tmpid[i]=rk[id[i]]]++;
for(int i=1;i<=num;i++)cnt[i]+=cnt[i-1];
for(int i=n;i;i--)sa[cnt[tmpid[i]]--]=id[i];
memcpy(oldrk,rk,sizeof(rk));
for(int i=1;i<=n;i++)rk[sa[i]]=cmp(sa[i-1],sa[i],t)?tot:++tot;
num=tot;
if(num>=n)break;
}
for(int i=1,j=0;i<=n;i++)
{
if(j)j--;
while(a[i+j]==a[sa[rk[i]-1]+j])j++;
height[rk[i]]=j;
}
}
inline bool work(int l,int r)
{
if(r-l+1<K)return 0;
int tot=0;
memset(vis,0,sizeof(vis));
for(int i=l;i<=r;i++)
if(!vis[pos[sa[i]]])
tot++,vis[pos[sa[i]]]=1;
return tot==K;
}
inline bool check(int mid)
{
int l=1,r=1;
while(l<=n)
{
while(height[r+1]>=mid&&r<n)r++;
if(work(l,r))return 1;
l=r+1;r=l;
}
return 0;
}
const int delta=1900;
int main()
{
scanf("%d",&K);
for(int i=1;i<=K;i++)
{
int k;scanf("%d",&k);
for(int j=0;j<k;j++)scanf("%d",&b[j]);
for(int j=1;j<k;j++)a[++n]=b[j]-b[j-1],pos[n]=i;
a[++n]=i+delta;pos[n]=i;
}
sa_build();
int l=0,r=n,ans=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d",ans+1);//+1!!!
return 0;
}
luoguP2463 [SDOI2008]Sandy的卡片的更多相关文章
- [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)
传送门 很容易想到,题目中的相同是指差分数组相同. 那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数 双指针移动,用st表维护height数组中的最小值. 当然用单调队列应该也可以且更 ...
- BZOJ 4698: Sdoi2008 Sandy的卡片
4698: Sdoi2008 Sandy的卡片 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 106 Solved: 40[Submit][Stat ...
- BZOJ 4698: Sdoi2008 Sandy的卡片 [后缀自动机]
4698: Sdoi2008 Sandy的卡片 题意:差分后就是多个串LCS SAM+map大法好 模板打错 智力-2 #include <iostream> #include <c ...
- 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...
- bzoj4698 / P2463 [SDOI2008]Sandy的卡片
P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...
- 【BZOJ4698】Sdoi2008 Sandy的卡片 后缀数组+RMQ
[BZOJ4698]Sdoi2008 Sandy的卡片 Description Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡 ...
- 【BZOJ4698】[SDOI2008]Sandy的卡片
[BZOJ4698][SDOI2008]Sandy的卡片 题面 flag倒了. bzoj 洛谷 题解 首先题目的区间加很丑对吧, 将每个串差分一下,就可以转化为 求: 给定\(N\)个串,求他们的最长 ...
- P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
P2463 [SDOI2008]Sandy的卡片 套路都差不多,都是差分后二分答案找lcp.只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序 ...
- [bzoj4698][Sdoi2008]Sandy的卡片_后缀数组_二分/单调队列_双指针
Sandy的卡片 bzoj-4698 Sdoi-2008 题目大意:题目链接. 注释:略. 想法: 这个题跟一个Usaco的题特别像.我们把这些串差分 现在我们要求的就是公共子串且出现次数不少于$k$ ...
随机推荐
- 201871010116-祁英红《面向对象程序设计(java)》第十四周学习总结
博文正文开头格式:(2分) 项目 内容 <面向对象程序设计(java)> https://home.cnblogs.com/u/nwnu-daizh/ 这个作业的要求在哪里 https:/ ...
- 'index.js' does not match the corresponding name on disk: '.\node_modules\
跟着视频教程学习react的时候,遇到一个问题,困扰了一阵,最后发现真的很傻! 问题如下: 最后发现是import语句写的有问题,把react写成了React: 正确的引入语句是: import Re ...
- matlab练习程序(点云密度)
算法思路是首先建立kd树,然后找到每个点距离最近的点的距离,对距离求和再求平均即可. 代码如下: clear all; close all; clc; pc = pcread('rabbit.pcd' ...
- Codeforces Round #599 (Div. 1) A. Tile Painting 数论
C. Tile Painting Ujan has been lazy lately, but now has decided to bring his yard to good shape. Fir ...
- linux常用命令指南——查找文件我最强:find
2.3.2 查找文件我最强:find 2.3.2.1 find查找常用命令示例 find / -name 'wfy.txt' # 从根目录下开始查找文件wfy.txt find . -name '*f ...
- Python连载50-贪婪匹配、XPath介绍
一.贪婪和非贪婪 1.贪婪:尽可能多的匹配,(*)表示贪婪匹配 2.非贪婪:找到符合条件的最小内容即可,(?)表示非贪婪 3.正则默认使用贪婪匹配 import re title = u"& ...
- ES5提取公共变量
在ES5中,请求地址前缀等需要作为公共变量提出. 则需在common.js写上 Object.defineProperty(window,'base',{ value:"http://xx. ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 4
18.4 创建PDO对象 使用PDO在与不同数据库管理系统之间交互时,PDO对象中的成员的方法是统一各种数据库的访问接口,所以在使用PDO与数据库交互之前,首先要创建一个PDO对象.在通过构造方法创 ...
- 【Oracle命令】sql语句之排序(order by)
通过对数据库数据进行降序排序来达到显示最新数据在前面的效果 -- 降序排序(最新的显示在前面) SELECT * FROM 表名 t ORDER BY t.uploadDatetime DESC; 格 ...
- Ansible快速开始-指挥集群
Ansible可以集中地控制多个节点,批量地执行ssh命令.由于其使用ssh进行操作,因此远端服务器除了安装openssh-server(一般服务器已经内置)之外,不需要安装额外的软件,因此使用非常简 ...