CF825F String Compression

题意

给定一个串s,其中重复出现的子串可以压缩成 “数字+重复的子串” 的形式,数字算长度。

只重复一次的串也要压。

求压缩后的最小长度。

数据范围

\(0 \le |s| \le 8,000\)

时空范围:

2sec 512mb


时空范围让我们基本可以\(O(N^2)\)做了

先考虑如果原串的每一个子串都求出了它的压缩后长度存在了\(cnt[i][j]\)里,我们就可以很方便的做DP了

令\(dp[i]\)表示长为\(i\)的串的最小压缩程度

\(dp[i]=min_{j=0}^{i-1}(dp[j]+cnt[j+1][i])\)

考虑求出每一个串的压缩后长度

枚举每一个位置为起点的子串,求出此时的\(nxt\)数组

则如果子串的子串中有从头开始循环的串,我们可以用子串的子串的长度\(len-nxt[len]\)得到循环节的长度

如下图

如果长度可以整除循环节的长度,则求出长度。否则直接为原长度+1


Code:

#include <cstdio>
#include <cstring>
int min(int x,int y){return x<y?x:y;}
const int N=8010;
int dp[N],nxt[N],cnt[N][N],n;
char c[N];
int get(int x)
{
int cnt=0;
while(x)
{
cnt++;
x/=10;
}
return cnt;
}
int main()
{
scanf("%s",c+1);
n=strlen(c+1);
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;i++)
{
memset(nxt,0,sizeof(nxt));
cnt[i][i]=2;
nxt[i]=i-1;
for(int j=i+1,k=i-1;j<=n;j++)
{
while(k!=i-1&&c[k+1]!=c[j]) k=nxt[k];
if(c[k+1]==c[j]) k++;
nxt[j]=k;
int len=j+1-i;
if(len%(len-nxt[j]+i-1)==0)
cnt[i][j]=(len-nxt[j]+i-1)+get(len/(len-nxt[j]+i-1));
else
cnt[i][j]=len+1;
}
}
for(int i=1;i<=n;i++)
for(int j=0;j<i;j++)
dp[i]=min(dp[i],dp[j]+cnt[j+1][i]);
printf("%d\n",dp[n]);
return 0;
}

2018.7.25

CF825F String Compression 解题报告的更多相关文章

  1. 【LeetCode】443. String Compression 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用额外空间 不使用额外空间 日期 题目地址:htt ...

  2. 【LeetCode】186. Reverse Words in a String II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 每个单词单独翻转+总的翻转 日期 题目地址:https ...

  3. 【LeetCode】604. Design Compressed String Iterator 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 维护当前字符和次数 日期 题目地址:https://l ...

  4. 【LeetCode】942. DI String Match 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】541. Reverse String II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  6. 【LeetCode】557. Reverse Words in a String III 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  7. 【LeetCode】686. Repeated String Match 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. LeetCode 557 Reverse Words in a String III 解题报告

    题目要求 Given a string, you need to reverse the order of characters in each word within a sentence whil ...

  9. LeetCode 942 DI String Match 解题报告

    题目要求 Given a string S that only contains "I" (increase) or "D" (decrease), let N ...

随机推荐

  1. 我们一起学习WCF 第八篇回调函数

    什么是回调函数? 一个简单的例子:小明想要在京东购买一件商品.他会登陆网站选好自己的商品.然后他把这件商品放在购物车,然后开始付钱(这个表示触发,不付钱不发货(排除货到付款)).然后京东的人员收到了小 ...

  2. halcon学习相关资料(转载)

    https://blog.csdn.net/maweifei/article/details/78162581 论坛.培训 halcon学习网:http://www.ihalcon.com/ 鸟叔机器 ...

  3. 2.1 Oracle之DML的SQL语句之单表查询以及函数

    1.SQL简介 对于不同的数据库来说,SQL语句是相通的,关系型数据库都以SQL语句为操作的标准,只是相应的数据库对应的函数不相同. SQL(Structured Query Language,结构化 ...

  4. 深入了解MySQL存储索引

    (一)关于存储引擎 创建合适的索引是SQL性能调优中最重要的技术之一.在学习创建索引之前,要先了解MySql的架构细节,包括在硬盘上面如何组织的,索引和内存用法和操作方式,以及存储引擎的差异如何影响到 ...

  5. CSP201609-2:火车购票

    引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...

  6. 第1章 Python基础

    一.安装Python windows: 1.下载安装包     https://www.python.org/downloads/ 2.安装     默认安装路径:C:\python27 3.配置环境 ...

  7. 20130501-Twitter向全美用户开放广告平台Twitter Ads

    腾讯科技讯(晁晖)北京时间5月1日消息,据国外媒体报道,Twitter今天向所有美国用户开放了广告平台Twitter Ads.自2012年3月发布以来,Twitter Ads只向受邀请用户开放.Twi ...

  8. nginx 根据get参数重定向(根据电视访问的mac地址传递的值,来重定向访问别的url地址,这样就可以进行单台的测试环境。。)

    背景是这样的: 公司要做所有客户端的迁移到别的云平台,但又担心会有问题,所以考虑分批次迁移过去,这样就需要迁移部分用户,因为客户端刷但都是统一但rom包,不能轻易发生改动,所以决定用重定向方式将部分客 ...

  9. BFC的表象认识

    首先字面翻译,这三个字母分别代表什么,box,formatting, context,它决定了元素如何对其内容进行定位,以及与其他元素的关系和相互作用. 形象点就是说一种规范,规范什么呢?规范盒子内部 ...

  10. php异步学习(2)

    PHP开启异步多线程执行脚本   场景要求 客户端调用服务器a.php接口,需要执行一个长达5s-20s不等的耗资源操作,但是客户端响应请求时间为5秒(微信公众账号服务器请求响应超时时间),5s以上无 ...