当前位置: 首页 > ops >正文

撸呀撸的左手(KMP+DP)

题目描述

撸呀撸很迷茫,因为他的左手总是不受控制,做一些不雅的事情。于是撸呀撸一狠心,决定戒撸。没想到,他的左手受不了寂寞,一闲下来就在键盘上各种乱敲。

唔,神奇的左手表示,safasfasaafafsfafasffsfsfsffsfddfafdfsfadffafadfafadfadfafadfsfa……

他发现敲出来的字符串有一定规律:如果将字符串划分成若干部分,那么每部分都可由其子串重复若干次得到。
“若干次”往往大于1,但也可以为1。小撸想请你算一算:用最优的方法划分字符串,然后将各部分替换成其最短的连续重复子串,得到的字符串的最小长度是多少?

输入格式

一行字符,都是英文小写字母。

输出格式

一个正整数,是最小长度。

样例输入
bababacacac
样例输出
5
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4  using  namespace std ;
 5  #define inf 0x7fffffff
 6  #define MAXN 5010
 7  int pre[ MAXN ] , f[ MAXN ] , n ;
 8  char s[ MAXN ] , st[ MAXN ] ;
 9 
10  void kmp(  int len ) {
11     pre[  1 ] =  0 ;
12      for (  int i =  1 , j =  0 ; i ++ < len ; ) {
13          for ( ; j && st[ j +  1 ] != st[ i ] ; j = pre[ j ] ) ;
14          if ( st[ j +  1 ] == st[ i ] ) ++ j ;
15         pre[ i ] = j ;
16     }
17 }
18 
19  int main(  ) {
20     scanf(  " %s " , s +  1 ) ;
21     n = strlen( s +  1 ) ;
22     f[  0 ] =  0 ;
23      for (  int i =  0 ; i ++ < n ; ) {
24         f[ i ] = inf ;
25          int len =  0 ;
26          for (  int j = i ; j ; -- j ) st[ ++ len ] = s[ j ] ;
27         kmp( len ) ;
28          for (  int j = i -  1 ; j >=  0 ; -- j ) {
29              int l = i - j , cost ;
30             cost = ( l % ( l - pre[ l ] ) ) ? l : ( l - pre[ l ] ) ;
31             f[ i ] = min( f[ i ] , f[ j ] + cost ) ;
32         }
33     }
34     printf(  " %d\n " , f[ n ] ) ;
35      return  0 ;

36 } 

转载于:https://www.cnblogs.com/acvc/p/3540346.html

http://www.xdnf.cn/news/11507.html

相关文章:

  • 《北京遇上西雅图》[HD-RMVB.720p.国语中字][2013年爱情喜剧]
  • 安装VC,NTVDM CPU 遇到无效指令 --绝对能用的解决方法
  • 贝叶斯理论
  • wifi 暴力破解 (python)
  • 堆球问题,开普勒猜想(格密码相关)
  • 如何做国外SEO推广
  • springboard常用的使用方法和注解
  • 深入分析:香港 windows 和linux VPS 区别和使用需求
  • 华为nova鸿蒙系统名单,emui11鸿蒙更新名单都有什么?emui11鸿蒙更新名单介绍
  • Matlab中grid函数的使用
  • 利用模式进行构建第九讲——树形模式
  • 在html中include一个文件内容的几种方法
  • 计算机网络 day14 DNS域名劫持、DNS域名污染 - CDN的工作流程 - DNS的记录类型 - 搭建DNS缓存/主域名服务器 - DNAT-SNAT实验项目
  • Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行
  • 如何用MATLAB实现静态反馈控制
  • PKIX path building failed的问题分析
  • 各种软件版本号扫盲——Beta RC Preview release等
  • 倒计时 7 天 | 立即加入 GDE 成长计划,飞跃成为谷歌开发者专家
  • 机器学习-各分类模型优缺点(持续更新)
  • DVD转RMVB及DVD转AVI相关教程
  • Objective-C 编程语言官网文档(一)-简介
  • 看程序员如何给女朋友解释什么是锟斤拷?
  • 同一个局域网下访问电脑本地的localhost网址
  • 什么是网口温湿度传感器?什么是以太网温湿度传感器?
  • KVM+GFS分布式存储系统构建KVM高可用
  • python基础,黑马最新配套视频笔记
  • 气体管道管径及流量对照表_De、DN、D、d怎么搞懂他们?附管径与阀门通径对照表...
  • Android4.0 SDK新功能详解
  • MyEclipse 7.0下载 + 汉化 + doc汉化
  • 手机游戏无障碍设计——猜地鼠之Android篇