贪心,求出前$i$个字符串所能组成的字典序最小的字符串$ans$(特别的,这里的字典序有$ab>abc$),同时保证剩下的长度能通过$l_{i+1},...,l_{n}$拼接

考虑插入一个字符串$s_{i+1}$,在$ans$的任意拼接处(包括开头)可以替换上这个串,之后使得$ans$的字典序最小且长度合法,容易发现有:第一个能使$ans$字典序变小(这里指严格变小)的位置一定是使得$ans$字典序最小的位置(如果不存在就加在最后)

枚举插入的位置(所有合法断点的位置),相当于要判断插入后能否让$ans$更小,由于前半部分相同,即比较$s_{i+1}$和$ans$的一个后缀,暴力比较复杂度为$o(n^{2}k)$,无(ke)法(yi)通过

考虑二分+hash找到lcp,之后判断下一个字符即可,这样复杂度为$o(nk\log_{2}k)$(这里不是$o(n^{2}\log_{2}k)$的原因是需要计算hash值),常数比较优秀可以通过

还可以发现这是一个exkmp的模板题,时间复杂度可以做到$o(nk)$

然而这道题还有很多的细节,这里给出几组毒瘤的数据(/为回车):3 3/abd/ab/c,3 3/abc/ab/d,4 3/a/b/abd/c,3 3/a/aa/ab,4 4/a/a/aa/b,4 4/a/aa/c/ab(答案自己手算)

(不过atcoder的数据极水,这些数据全错+暴力求lcp都是可以通过的)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 10005
4 int n,k,len,l[N],a[N],b[N],extend[N],f[2005][N];
5 char s[2005][N],ans[N];
6 void calc(int l1,char *s1,int l2,char *s2){
7 memset(extend,0,sizeof(extend));
8 for(int i=0;i<l1;i++)
9 while ((i+extend[i]<l1)&&(extend[i]<l2)&&(s1[i+extend[i]]==s2[extend[i]]))extend[i]++;
10 }
11 int main(){
12 scanf("%d%d",&n,&k);
13 for(int i=1;i<=n;i++){
14 scanf("%s",s[i]);
15 l[i]=strlen(s[i]);
16 }
17 f[n+1][0]=1;
18 for(int i=n;i;i--)
19 for(int j=k;j>=0;j--){
20 f[i][j]=f[i+1][j];
21 if (j>=l[i])f[i][j]|=f[i+1][j-l[i]];
22 }
23 len=a[0]=0;
24 for(int i=1;i<=n;i++){
25 calc(len,ans,l[i],s[i]);
26 b[0]=0;
27 int flag=0,lll=0,aa=0,bb=0;
28 for(int j=0,ll=0;j<=a[0];ll+=a[++j]){
29 if ((k<ll+l[i])||(!f[i+1][k-ll-l[i]])){
30 if (j<a[0])b[++b[0]]=a[j+1];
31 continue;
32 }
33 int x=extend[ll];
34 if (x==l[i]){
35 b[++b[0]]=a[j+1];
36 continue;
37 }
38 if (ll+x==len){
39 flag=1;
40 aa=j;
41 bb=b[0];
42 lll=ll;
43 if (j<a[0])b[++b[0]]=a[j+1];
44 continue;
45 }
46 if (ans[ll+x]>s[i][x]){
47 flag=0;
48 len=ll+l[i];
49 for(int p=0;p<l[i];p++)ans[ll+p]=s[i][p];
50 while ((j<a[0])&&(a[j+1]<=x)){
51 x-=a[++j];
52 l[i]-=a[j];
53 b[++b[0]]=a[j];
54 }
55 b[++b[0]]=l[i];
56 break;
57 }
58 if (j<a[0])b[++b[0]]=a[j+1];
59 }
60 if (flag){
61 int x=extend[lll],j=aa,ll=lll;
62 b[0]=bb;
63 len=ll+l[i];
64 for(int p=0;p<l[i];p++)ans[ll+p]=s[i][p];
65 while ((j<a[0])&&(a[j+1]<=x)){
66 x-=a[++j];
67 l[i]-=a[j];
68 b[++b[0]]=a[j];
69 }
70 b[++b[0]]=l[i];
71 }
72 mempcpy(a,b,sizeof(a));
73 }
74 printf("%s",ans);
75 }

[atARC058F]Lroha Loves Strings的更多相关文章

  1. [CodeForces - 447B] B - DZY Loves Strings

    B - DZY Loves Strings DZY loves collecting special strings which only contain lowercase letters. For ...

  2. Codeforces Round #254 (Div. 1) D - DZY Loves Strings

    D - DZY Loves Strings 思路:感觉这种把询问按大小分成两类解决的问题都很不好想.. https://codeforces.com/blog/entry/12959 题解说得很清楚啦 ...

  3. Codeforces Round #254 (Div. 1) D. DZY Loves Strings hash 暴力

    D. DZY Loves Strings 题目连接: http://codeforces.com/contest/444/problem/D Description DZY loves strings ...

  4. Codeforces Round #FF (Div. 2):B. DZY Loves Strings

    B. DZY Loves Strings time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 题解-ARC058D Iroha Loves Strings

    题面 ARC058D Iroha Loves Strings 给定 \(n\) 个字符串,从中选出若干个按给出顺序连接起来,总长等于 \(m\),求字典序最小的,保证有解. 数据范围:\(1\le n ...

  6. CF447B DZY Loves Strings 贪心

    DZY loves collecting special strings which only contain lowercase letters. For each lowercase letter ...

  7. 文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition) (优先队列)

    题目链接:http://abc042.contest.atcoder.jp/tasks/abc042_b Time limit : 2sec / Memory limit : 256MB Score ...

  8. HDU 5229 ZCC loves strings 博弈

    题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5229 bc:http://bestcoder.hdu.edu.cn/contests/con ...

  9. Atcoder Regular Contest 058 D - 文字列大好きいろはちゃん / Iroha Loves Strings(单调栈+Z 函数)

    洛谷题面传送门 & Atcoder 题面传送门 神仙题. mol 一发现场(bushi)独立切掉此题的 ycx %%%%%%% 首先咱们可以想到一个非常 naive 的 DP,\(dp_{i, ...

随机推荐

  1. 修改MySql Root密码(包含忘记密码的方式)

    曾几何时,我也是记得MySQL root密码的人,想要修改root密码还不是轻而易举的事?下面前三种修改改方式都是在记得密码的情况下进行修改,如果你忘记了原本的root,请直接跳至 终极 第一种: 在 ...

  2. hd-cg辉度通用代码生成器

    HD-CG 辉度通用代码生成器 主要特点: 1. 自定义代码模板:通过简单的默认变量自行编写代码模板,如果默认变量不满足需求,也可增加自定义变量. 2. 自定义数据源:可自定义添加多个项目的数据库,数 ...

  3. 洛谷4755 Beautiful Pair (分治)

    题目描述 小D有个数列 \(a\),当一个数对 \((i,j)(i\le j)\) 满足\(a_i\)和\(a_j\)的积 不大于 \(a_i \cdots a_j\) 中的最大值时,小D认为这个数对 ...

  4. Spring 框架学习

    转载自前辈:我没有三个新脏 Spring学习(1)--快速入门 认识 Spring 框架 Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (I ...

  5. FastAPI 学习之路(五)

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四)  我们之前的文章分享了 ...

  6. 初探webpack之从零搭建Vue开发环境

    初探webpack之搭建Vue开发环境 平时我们可以用vue-cli很方便地搭建Vue的开发环境,vue-cli确实是个好东西,让我们不需要关心webpack等一些繁杂的配置,然后直接开始写业务代码, ...

  7. Java(10)认识类和对象

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201574.html 博客主页:https://www.cnblogs.com/testero ...

  8. 【转】简述C和C++的学习历程

    简述C和C++的学习历程(转) --by:肖舸老师总是被同学们问到,如何学习C和C++才不茫然,才不是乱学,想了一下,这里给出一个总的回复. 一家之言,欢迎拍砖哈. 1.可以考虑先学习C. 大多数时候 ...

  9. 【UE4 C++】获取运行时间、设置时间流速、暂停游戏

    基于UGameplayStatics 获取运行时间 /** Returns the frame delta time in seconds, adjusted by time dilation. */ ...

  10. 【c++ Prime 学习笔记】第18章 用于大型程序的工具

    大规模应用程序的特殊要求包括: 在独立开发的子系统之间协同处理错误:异常处理 使用各种库(可能包含独立开发的库)进行协同开发:命名空间 对比较复杂的应用概念建模:多重继承 18.1 异常处理 异常处理 ...