博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[SDOI2008]Sandy的卡片
阅读量:4335 次
发布时间:2019-06-07

本文共 1919 字,大约阅读时间需要 6 分钟。

题目描述

Sandy和Sue的热衷于收集干脆面中的卡片。

然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型。

每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人物模型。相同的定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串。

Sand的卡片数远远小于要求的N,于是Sue决定在Sandy的生日将自己的卡片送给Sandy,在Sue的帮助下,Sandy终于集够了N张卡片,但是,Sandy并不清楚他可以兑换到哪个等级的人物模型,现在,请你帮助Sandy和Sue,看看他们最高能够得到哪个等级的人物模型。

输入输出格式

输入格式:

第一行为一个数N,表示可以兑换人物模型最少需要的卡片数,即Sandy现在有的卡片数

第i+1行到第i+N行每行第一个数为第i张卡片序列的长度Mi,之后j+1到j+1+Mi个数,用空格分隔,分别表示序列中的第j个数

输出格式:

一个数k,表示可以获得的最高等级。

输入输出样例

输入样例#1:
22 1 23 4 5 9
输出样例#1:
2

说明

数据范围:

30%的数据保证n<=50

100%的数据保证n<=1000

因为是“相似”,所以把n个字符串差分

用不同且未出现的分隔符连起来

然后求后缀数组和LCP

二分答案k

把连续的h值不小于k的分为一组,如果一组内集齐了n个字符串的后缀

那么就可以构成长度为k的相似子串

1 #include
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 int s[2000001],c[2000001],SA[2000001],h[2000001],n,m,x[2000001],y[2000001],rank[2000001],ans,tot,len[1501],cnt; 8 int bel[2000001],mx=4000,a[2001][2001],top,st[2000001]; 9 bool vis[1501]; 10 void radix_sort() 11 {
int i; 12 for (i=0;i
=0;i--) 19 SA[--c[x[y[i]]]]=y[i]; 20 } 21 void build_SA() 22 { int i,j,k,p; 23 for (i=0;i
=k) y[p++]=SA[i]-k; 34 radix_sort(); 35 p=1;swap(x,y); 36 x[SA[0]]=0; 37 for (i=1;i
=n) break; 40 m=p; 41 } 42 for (i=0;i
0) 47 { 48 if (L>0) L--; 49 j=SA[rank[i]-1]; 50 while (i+L
>tot;r=2e9; 77 for (i=1;i<=tot;i++) 78 { 79 scanf("%d",&len[i]); 80 r=min(r,len[i]); 81 for (j=1;j<=len[i];j++) 82 { 83 scanf("%d",&a[i][j]); 84 } 85 } 86 for (i=1;i<=tot;i++) 87 { 88 for (j=2;j<=len[i];j++) 89 { 90 s[cnt]=a[i][j]-a[i][j-1]+2000; 91 bel[cnt]=i; 92 cnt++; 93 } 94 s[cnt++]=++mx; 95 } 96 n=cnt; 97 build_SA(); 98 l=1;r--; 99 ans=0;100 while (l<=r)101 {102 int mid=(l+r)/2;103 if (check(mid)) ans=mid,l=mid+1;104 else r=mid-1;105 }106 cout<

 

转载于:https://www.cnblogs.com/Y-E-T-I/p/8480466.html

你可能感兴趣的文章
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Ubuntu菜鸟入门(五)—— 一些编程相关工具
查看>>
valgrind检测linux程序内存泄露
查看>>
Hadoop以及组件介绍
查看>>
1020 Tree Traversals (25)(25 point(s))
查看>>
第一次作业
查看>>
“==”运算符与equals()
查看>>
单工、半双工和全双工的定义
查看>>
Hdu【线段树】基础题.cpp
查看>>
时钟系统
查看>>
BiTree
查看>>
5个基于HTML5的加载动画推荐
查看>>
水平权限漏洞的修复方案
查看>>
静态链接与动态链接的区别
查看>>
Android 关于悬浮窗权限的问题
查看>>
如何使用mysql
查看>>
linux下wc命令详解
查看>>
敏捷开发中软件测试团队的职责和产出是什么?
查看>>