Uva 1630 折叠串
题目链接:https://uva.onlinejudge.org/external/16/1630.pdf
题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。
刚看到这个题目,没有一点思路,还是大牛们厉害!
分析:一个串,可以转成两种形式,要么本身可以转成有重叠部分的串,要么分成两个部分,再转成有重叠部分的串。
本身是否是重叠串,利用kmp查,分成两个部分,遍历一遍所有情况,这样,dp顺序就出来了,最外层是每次查的长度,第二层就是,利用这个长度,从每一个点开始查起。状态描叙是d[i][j]从 i 到 j 的最短字符串。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 100 + 10; 5 6 string d[maxn][maxn]; 7 char s[maxn],t[maxn]; 8 9 10 11 int f[maxn]; 12 13 string ToString(int x) 14 { 15 string ans = ""; 16 while(x) 17 { 18 ans +=(char)('0'+(x%10)); 19 x/=10; 20 } 21 reverse(ans.begin(),ans.end()); 22 return ans; 23 } 24 25 void getFail(char* s) 26 { 27 int len = strlen(s); 28 f[0] = f[1] = 0; 29 for(int i=1; i<len; i++) 30 { 31 int j = f[i]; 32 while(j&&s[i]!=s[j]) 33 j = f[j]; 34 f[i+1] = s[i]==s[j] ? j+1:0; 35 } 36 } 37 38 int main() 39 { 40 while(scanf("%s",s)!=EOF) 41 { 42 int len = strlen(s); 43 for(int i=0; i<len; i++) 44 d[i][i] = string("")+s[i]; 45 46 47 for(int l=2; l<=len; l++) 48 { 49 for(int i=0; i + l - 1 < len; i++) 50 { 51 int j = i + l - 1; 52 d[i][j] = ""; 53 for(int k=i; k<=j; k++) 54 { 55 d[i][j] +=s[k]; 56 t[k-i] = s[k]; 57 } 58 59 t[j-i+1] = 0; 60 getFail(t); 61 if(l%(l-f[l])==0) //自身是重复的 62 { 63 int cycle = l - f[l]; 64 string t = ""; 65 t = ToString(l/cycle); 66 t+='('; 67 t+=d[i][i+cycle-1]; 68 t+=')'; 69 if(t.length()<d[i][j].length()) d[i][j] = t; 70 } 71 72 for(int k=i; k<j; k++) 73 { 74 if(d[i][k].length()+d[k+1][j].length()<d[i][j].length()) 75 { 76 d[i][j] = d[i][k] + d[k+1][j]; 77 } 78 } 79 } 80 } 81 cout<<d[0][len-1]<<endl; 82 } 83 return 0; 84 }
转载于:https://www.cnblogs.com/TreeDream/p/6240805.html
Uva 1630 折叠串相关推荐
- uva 1630——Folding
题意:给出一个由大写字母组成的长度为n的串,然后尽量折叠成一个尽量短的串,折叠可以嵌套. 思路:区间dp,dp(i,j)表示区间(i,j)的最短的串的长度,as(i,j)表示i到j的答案,有两个状态要 ...
- UVA 1630 Folding
题目链接:http://acm.hust.edu.cn/vjudge/problem/51191 题意:给一个字符串,相同部分可以折叠,折叠可以嵌套.求最短长度的一种折叠方法.括号和数字的长度也要考虑 ...
- 紫书《算法竞赛入门经典》
紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...
- c语言的四大圣经,传说中的模拟电子四大圣经--值得永久珍藏
目录 第一章 集成电路放大器件模型 1.1 引言 1.2 PN结的耗尽区 1.3 双极型晶体管的大信号特性 1.4 双极型晶体管的小信号模型 1.5 金属氧化物效晶体管的大信号特性 1.6 MOS晶体 ...
- [搜索]UVa 129 困难的串
题意:将一个包含两个相邻的重复子串的子串,称为"容易的串",其他为"困难的串". 输入正整数n和l,输出由前l个字符组成的,字典序第n小的困难的串. 输入样例: ...
- UVa 11027 - Palindromic Permutation 回文串,组合加搜索
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=s ...
- UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)
题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...
- 回文串 --- 动态dp UVA 11584
题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...
- UVA - 129 Krypton Factor (困难的串)(回溯法)
题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...
最新文章
- DotNet Core Console 程序使用NLog
- SIGGRAPH2018黑科技:开源语义软分割改进图像编辑
- 北京某打工子弟学校之二
- iOS - 上架的APP 生成二维码下载
- 对PostgreSQL中后台进程内存挂载的初步学习
- windows mysqldump 不成功 1049 1064 报错
- 对象工厂PHP,php – 域对象工厂是什么样的?
- 华为申请注册华为鸿蒙商标,华为申请注册“华为鸿蒙”商标,自研操作系统或将实现?-控制器/处理器-与非网...
- win10开发java_java的开发环境(win10)
- fastjson使用-- @JSONField使用(转)
- [Linux/Unix]常用命令
- Java职业规划(职业晋升路线、技术转移路线、工作经验与技术栈的匹配)——学习笔记
- 重装系统是否影响计算机,电脑重装系统会对电脑造成伤害吗? 答案说出来你可能都不信...
- 推荐系统深度学习篇-NFM 模型介绍(1)
- Linux如何测试驱动性能,掌握 Linux PC 性能之基准测试
- word无法验证服务器,Win8系统打开office文件提示“无法验证此产品的许可证”如何解决...
- html图片不平铺,css图片不平铺怎么设置?
- 常用的c语言,C语言常用.docx
- 洛达应用层开发教程系列1-UI框架
- 电脑桌面图标不见了怎么回事?正确的找回图标的2个方案
热门文章
- C#使用SetWindowsHookEx时报错“类型的已垃圾回收委托进行了回调”
- Web开发编程语言是最适合新手的吗-开课吧
- C++基础:C++的路径表示有哪些
- QTP自动化测试从零基础到精通进阶(脚本测试、VBS语法、描述性编程、测试框架)...
- linux中nmcli命令使用及网络配置
- BSGS-BabyStepGiantStep算法+拓展
- C#会对于未赋值的变量/成员变量,给予一个初始值吗?
- 同一主机,不同域名绑定不同网站(IIS主机头实现方法)
- Nagios+Cacti模块——Nagios+Cacti 搭建及整合(一)
- RFID Cooking with Mifare Classic