洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告
P2463 [SDOI2008]Sandy的卡片
题意
给\(n(\le 1000)\)串,定义两个串相等为“长度相同,且一个串每个数加某个数与另一个串完全相同”,求所有串的最长公共子串,每个串长\(\le 101\),值域\(\in [0,1864]\)
先差分一下,然后连在一起中间加分隔符建sa
然后dp一下,要用到lcp,复杂度\(O(nm^2+n\log n)\)
Code:
#include <cstdio>
#include <algorithm>
using std::min;
using std::max;
const int N=2e5;
int tax[N],sa[N],Rank[N],sec[N],n,m=2000,hei[N],st[N][18],Log[N];
int s[N],dp[N],L[110],R[110],num,mi[1100];
void Rsort()
{
for(int i=1;i<=m;i++) tax[i]=0;
for(int i=1;i<=n;i++) ++tax[Rank[i]];
for(int i=1;i<=m;i++) tax[i]+=tax[i-1];
for(int i=n;i;i--) sa[tax[Rank[sec[i]]]--]=sec[i];
}
bool cmp(int x,int y,int l){return sec[x]==sec[y]&&sec[x+l]==sec[y+l];}
void SuffixSort()
{
for(int i=1;i<=n;i++) Rank[i]=s[i],sec[i]=i;
Rsort();
for(int w=1,p=0;p<n;m=p,w<<=1)
{
p=0;for(int i=n-w+1;i<=n;i++) sec[++p]=i;
for(int i=1;i<=n;i++) if(sa[i]>w) sec[++p]=sa[i]-w;
Rsort(),std::swap(Rank,sec),Rank[sa[1]]=p=1;
for(int i=2;i<=n;i++) Rank[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
}
//h[i]>=h[i-1]-1;
for(int i=1,p=0,j;i<=n;hei[Rank[i]]=p,i++)
for(p=p?p-1:p,j=sa[Rank[i]-1];s[i+p]==s[j+p];++p);
Log[0]=-1;for(int i=1;i<=n;i++) st[i][0]=hei[i],Log[i]=Log[i>>1]+1;
for(int j=1;j<=17;j++)
{
for(int i=1;i<=n-(1<<j)+1;i++)
st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
}
int lcp(int x,int y)
{
if(x>y) return lcp(y,x);
++x;
int d=Log[y+1-x];
return min(st[x][d],st[y-(1<<d)+1][d]);
}
int main()
{
scanf("%d",&num);
for(int las,i=1;i<=num;i++)
{
scanf("%d",mi+i);
--mi[i];
L[i]=n+1;
scanf("%d",&las);
for(int bee,j=1;j<=mi[i];j++)
{
scanf("%d",&bee);
s[++n]=bee-las+m;
las=bee;
}
R[i]=n++;
}
m=4000,--n;
for(int i=2;i<=num;i++) s[L[i]-1]=++m;
SuffixSort();
for(int i=1;i<=mi[1];i++) dp[i]=mi[1]+1-i;
for(int i=2;i<=num;i++)
{
for(int j=L[i];j<=R[i];j++)
for(int k=L[i-1];k<=R[i-1];k++)
dp[j]=max(dp[j],min(dp[k],lcp(Rank[k],Rank[j])));
}
int ans=0;
for(int i=L[num];i<=R[num];i++) ans=max(ans,dp[i]);
printf("%d\n",ans+1);
return 0;
}
2019.2.1
洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告的更多相关文章
- 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)
题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...
- [洛谷P2463][SDOI2008]Sandy的卡片
题目大意:有$n$个字符串,求这$n$个字符串中最长的相似公共字串,相似的定义是加上一个数后相同 题解:差分,建广义后缀自动机,然后求出每个点在多少个字符串中出现过,若在$n$个中都出现,就更新答案 ...
- 洛咕 P2463 [SDOI2008]Sandy的卡片
哈希水过. 首先这是一段delta相同的序列,按照套路差分一下,b[i]=a[i]-a[i-1],然后就是这些序列的最长公共子段 由于数据范围很小,就可以二分,枚举第一个序列的子段然后每个子序列暴力c ...
- bzoj4698 / P2463 [SDOI2008]Sandy的卡片
P2463 [SDOI2008]Sandy的卡片 直接二分长度暴力匹配....... 跑的还挺快 (正解是后缀数组的样子) #include<iostream> #include<c ...
- P2463 [SDOI2008]Sandy的卡片[差分+串拼接后缀数组]
P2463 [SDOI2008]Sandy的卡片 套路都差不多,都是差分后二分答案找lcp.只是这题要把多个串拼接起来成为一个大串,中间用某些值域中没有的数字相隔(最好间隔符都不一样想想为什么),排序 ...
- 洛谷 P2323 [HNOI2006]公路修建问题 解题报告
P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...
- Luogu P2463 [SDOI2008]Sandy的卡片
题目链接 \(Click\) \(Here\) 真的好麻烦啊..事实证明,理解是理解,一定要认认真真把板子打牢,不然调锅的时候真的会很痛苦..(最好是八分钟能无脑把\(SA\)码对的程度\(QAQ\) ...
- P2463 [SDOI2008]Sandy的卡片
写一种\(O(nm)\)的做法,也就是\(O(\sum 串长)\)的. 先通过差分转化,把每个数变成这个数与上一个数的差,第一个数去掉,答案就是最长公共子串+1 按照套路把所有串拼起来,中间加一个分隔 ...
- 洛谷 P1852 [国家集训队]跳跳棋 解题报告
P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...
随机推荐
- zookeepeer使用zkCli.sh命令
一.连接服务器端 [root@sxl132 zookeepeer]# ./bin/zkCli. Connecting to -- ::, [myid:] - INFO [main:Environmen ...
- linux环境下nc命令的应用
一.安装 下载 http://vault.centos.org/6.6/os/x86_64/Packages/nc-1.84-22.el6.x86_64.rpm rpm -iUv nc-1.84-22 ...
- 【SQL】四种排序开窗函数
一 .简单了解什么是开窗函数 什么是开窗函数,开窗函数有什么作用,特征是什么? 所谓开窗函数就是定义一个行为列,简单讲,就是在你查询的结果上,直接多出一列值(可以是聚合值或是排序号),特征就是带有ov ...
- Centos7 -- glibc 升级失败、意外删除、故意删除后的处理方法
第一部分:测试(如果不是想测试效果,可以直接跳到第三部分) 鉴于不久前 glibc-2.29 升级失败导致一系列的工具无法正常使用,‘’ 本着研究精神的我决定删除 glibc及其库文件 ,测试影响范围 ...
- springboot @Value 获取计算机中绝对路径文件的内容
默认情况下使用 @Value("aaa.txt") private Resource txtResource; 这样获取到的是项目classpath 下的 aaa.txt 如果想获 ...
- Linux下rsyslog日志收集服务环境部署记录
rsyslog 可以理解为多线程增强版的syslog. 在syslog的基础上扩展了很多其他功能,如数据库支持(MySQL.PostgreSQL.Oracle等).日志内容筛选.定义日志格式模板等.目 ...
- systemctl添加开机启动
我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...
- Python-复习-习题-13
复习 dict: dic = {'name':'alex'}增:dic['age'] = 21 存在就覆盖dic.setdefault() 存在什么也不做,没有就增加 删除:pop()按照key删除, ...
- Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C. Plasticine zebra
问了学长,感觉还是很迷啊,不过懂了个大概,这个翻转操作,实质不就是在序列后面加上前面部分比如 bw | wwbwwbw 操作过后 wbwbwwbww 而 bw | wwbwwbwbw 这样我们就知道 ...
- Linux内核分析— —扒开系统调用的三层皮(上)
实验部分 根据系统调用表,选取一个系统调用.我选得是mkdir这个系统调用,其系统调用号为39,即0x27 由于mkdir函数的原型为int mkdir (const char *filename, ...