FZOJβ #31.字符串
http://1572m36l09.iask.in:30808/problem/31
首先转化为保留尽量少的段使得字典序最大。考虑逐字符确定,
显然我们可以将相同的连续字符缩在一起。注意到字典序最大的
字符一定会在前缀中保留尽量多次,我们可以将字符相同的连续
段按照出现次数排序,并逐一确定。在确定最后一段时,我们需
要考虑剩余部分后缀对串的大小的影响。使用后缀数组处理,时
间复杂度为 O(|s| log |s|)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
;
struct node
{
int l,r;
}a[N];
vector<node> vct[];
int t,K,n,m,i,j,k,l,x,y,sa[N],rk[N],Y[N],c[N],len;
char s[N],ans[N];
bool cmp(node a,node b)
{
return a.l<b.l;
}
bool cmq(node a,node b)
{
if(a.r-a.l!=b.r-b.l)
return a.r-a.l>b.r-b.l;
return a.l<b.l;
}
void add(char c,int x)
{
while(x--)
ans[++len]=c;
}
int main()
{
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
scanf("%d",&t);
while(t--)
{
scanf();
)//注意K==0时要特判
{
puts(s+);
continue;
}
n=strlen(s+);
m=;
len=;
;i<=n;++i)
rk[i]=s[i];
;i<=m;++i)
c[i]=;
;i<=n;++i)
c[rk[i]]++;
;i<=m;++i)
c[i]+=c[i-];
;i<=n;++i)
sa[c[rk[i]]--]=i;
;k<=n;k<<=)
{
,l=;i<=n;++i)
Y[++l]=i;
;i<=n;++i)
if(sa[i]>k)
Y[++l]=sa[i]-k;
;i<=m;++i)
c[i]=;
;i<=n;++i)
c[rk[i]]++;
;i<=m;++i)
c[i]+=c[i-];
;--i)
sa[c[rk[Y[i]]]--]=Y[i];
;i<=n;++i)
Y[i]=rk[i];
rk[sa[]]=m=;
;i<=n;++i)
rk[sa[i]]=(Y[sa[i]]==Y[sa[i-]]&&(sa[i]+k>n?:Y[sa[i]+k])==(sa[i-]+k>n?:Y[sa[i-]+k])?m:++m);
if(rk[sa[n]]==n)//SA的一个优化
break;
}
rk[n+]=;//注意细节!!
;i<;++i)
vct[i].clear();
;i<=n;i=j)
{
for(j=i;j<=n&&s[i]==s[j];++j);
vct[s[i]-});
}
,j=k=;i>=;--i)
{
l=vct[i].size();
if(!l)
continue;
sort(vct[i].begin(),vct[i].end(),cmp);
;x<l&&vct[i][x].l<=j;++x);
if(x>=l)
continue;
)
{
add(i+);
j=vct[i][x++].r;
}
if(l-x+k<K)
{
j=vct[i][l-].r;
k+=l-x;
for(;x<l;++x)
add(i+);
continue;
}
sort(vct[i].begin()+x,vct[i].end(),cmq);
;++x)
{
add(i+);
++k;
j=max(j,vct[i][x].r);
}
k=vct[i][x].r-vct[i][x].l+;
add(i+'a',k);
;x<l&&vct[i][x].r-vct[i][x].l+==k;++x)
||rk[max(j+,vct[i][x].r+)]>rk[y])
y=max(j+,vct[i][x].r+);
for(;y<=n;++y)
add(s[y],);
j=n;
break;
}
ans[len+]=;
puts(ans+);
}
;
}
FZOJβ #31.字符串的更多相关文章
- 31:字符串p型编码
31:字符串p型编码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出s ...
- AC日记——字符串P型编码 openjudge 1.7 31
31:字符串p型编码 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个完全由数字字符('0','1','2',…,'9')构成的字符串str,请写出str的p型编码串.例如: ...
- NOI 1.7编程基础之字符串(35题)
01:统计数字字符个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 ...
- Python之字符串的特性及常用方法
字符串的特性 索引: (索引是从0开始) s='hello'print(s[0])print(s[4])print(s[-1]) #拿出最后一个字符 hoo12345678截取s[start:stop ...
- Python基础教程之第3章 使用字符串
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 Type "copyri ...
- [转]Python程序员必须知道的30条编程技巧
30 tips & tricks for Python Programming 1 直接交换两个数字位置 x, y = 10, 20 print(x, y) x, y = y, x prin ...
- Swift:网络库Alamofire
一,Alamofire的说明与配置 1,什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetworking 是 iOS 和 OS X 上很受欢迎的第三方H ...
- QJ系列笔记
1.求int型数据在内存中存储时1的个数输入一个int型数据,计算出该int型数据在内存中存储时1的个数. #include<stdio.h> void main() { ; int yu ...
- 如何实现在Windows上运行Linux程序,附示例代码
微软在去年发布了Bash On Windows, 这项技术允许在Windows上运行Linux程序, 我相信已经有很多文章解释过Bash On Windows的原理, 而今天的这篇文章将会讲解如何自己 ...
随机推荐
- Automake使用说明
说明 从零开始编写automake工程非常复杂也没有必要,我们只要能看懂开源项目的automake即可,然后根据自己实际情况进行修改即可,下面给出两个比较好的参考项目,其中spice-gtk涵盖了使用 ...
- Java 为程序创建日志系统
使用JAVA创建日志系统有两种方法 1.使用log4j操作日志文件 2.使用系统重定向输出日志信息 方法1:使用log4j操作日志文件(可使用jar或者xml) 步骤1:下载log4j.jar 下载地 ...
- 服务器宕机,mysql无法启动,job for mysql.service failed because the process exited with error code,数据库备份与恢复
[问题现象] 服务器在运行过程中,因人为意外导致电源被拔,服务器宕机,mysql重启不成功,报错如下 根据提示,输入systemctl status mysql.service和journalctl ...
- js 中止程序继续进行(break continue return throw)
1.break 跳出循环 2.continue 跳出本次循环,进入下次循环 3.return 中止当前函数继续执行 4.throw 异常信息;中止程序抛出异常,可用于中止程序
- NETCORE MVC模块化
NETCORE MVC模块化 ASP.NETCORE MVC模块化编程 前言 记得上一篇博客中跟大家分享的是基于ASP.NETMVC5,实际也就是基于NETFRAMEWORK平台实现的这么一个轻量级插 ...
- .NET Core中Circuit Breaker
谈谈Circuit Breaker在.NET Core中的简单应用 前言 由于微服务的盛行,不少公司都将原来细粒度比较大的服务拆分成多个小的服务,让每个小服务做好自己的事即可. 经过拆分之后,就避免不 ...
- 爬虫(正则)——爬neihan8
工具:python3 步骤: 1)定义spider类,将具体功能封装成方法 2)观察html页面,写好正确的正则表达式来找到符合规则的文字 3)写一个方法测试一下,保证每写好一个都是对的 4)加入提示 ...
- 【Java】JMM内存模型和JVM内存结构
JMM内存模型和JVM内存结构 JAVA内存模型(Java Memory Model) Java内存模型,一般指的是JDK 5 开始使用的新的内存模型,主要由JSR-133: JavaTM Memor ...
- Python使用selenium进行爬虫(一)
JAVA爬虫框架很多,类似JSOUP,WEBLOGIC之类的爬虫框架都十分好用,个人认为爬虫的大致思路就是: 1.挑选需求爬的URL地址,将其放入需求网络爬虫的队列,也可以把爬到的符合一定需求的地址放 ...
- AngularJS(五):表单及输入验证
本文也同步发表在我的公众号“我的天空” 表单基础 表单是HTML中很重要的一个部分,基本上我们的信息录入都依靠表单,接下来我们学习如何在AngularJS中使用表单,首先看以下示例代码: <bo ...