Uva 1630 折叠串
题目链接:https://uva.onlinejudge.org/external/16/1630.pdf
题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。
刚看到这个题目,没有一点思路,还是大牛们厉害!
分析:一个串,可以转成两种形式,要么本身可以转成有重叠部分的串,要么分成两个部分,再转成有重叠部分的串。
本身是否是重叠串,利用kmp查,分成两个部分,遍历一遍所有情况,这样,dp顺序就出来了,最外层是每次查的长度,第二层就是,利用这个长度,从每一个点开始查起。状态描叙是d[i][j]从 i 到 j 的最短字符串。
#include <bits/stdc++.h>
using namespace std; const int maxn = + ; string d[maxn][maxn];
char s[maxn],t[maxn]; int f[maxn]; string ToString(int x)
{
string ans = "";
while(x)
{
ans +=(char)(''+(x%));
x/=;
}
reverse(ans.begin(),ans.end());
return ans;
} void getFail(char* s)
{
int len = strlen(s);
f[] = f[] = ;
for(int i=; i<len; i++)
{
int j = f[i];
while(j&&s[i]!=s[j])
j = f[j];
f[i+] = s[i]==s[j] ? j+:;
}
} int main()
{
while(scanf("%s",s)!=EOF)
{
int len = strlen(s);
for(int i=; i<len; i++)
d[i][i] = string("")+s[i]; for(int l=; l<=len; l++)
{
for(int i=; i + l - < len; i++)
{
int j = i + l - ;
d[i][j] = "";
for(int k=i; k<=j; k++)
{
d[i][j] +=s[k];
t[k-i] = s[k];
} t[j-i+] = ;
getFail(t);
if(l%(l-f[l])==) //自身是重复的
{
int cycle = l - f[l];
string t = "";
t = ToString(l/cycle);
t+='(';
t+=d[i][i+cycle-];
t+=')';
if(t.length()<d[i][j].length()) d[i][j] = t;
} for(int k=i; k<j; k++)
{
if(d[i][k].length()+d[k+][j].length()<d[i][j].length())
{
d[i][j] = d[i][k] + d[k+][j];
}
}
}
}
cout<<d[][len-]<<endl;
}
return ;
}
Uva 1630 折叠串的更多相关文章
- UVA - 1630 Folding(串折叠)(dp---记忆化搜索)
题意:给出一个由大写字母组成的长度为n(1<=n<=100)的串,“折叠”成一个尽量短的串.折叠可以嵌套.多解时可输出任意解. 分析: 1.dp[l][r]为l~r区间可折叠成的最短串的长 ...
- UVa 1630 串折叠
https://vjudge.net/problem/UVA-1630 题意: 给出一个由大写字母组成的长度为n的串,折叠成一个尽量短的串.例如:AAAAAAAAABABABCCD折叠成9(A)3(A ...
- 习题9-4 uva 1630
题意: 给你一串数字,要求你对其进行折叠使其长度最短. 折叠情况:全是一个字母 & 重复的字符串 AAAAAAAAAABABABCCD --> 9(A)3(AB)CCD NEE ...
- Folding UVA - 1630
题目 ans[i][j]表示由原串第i个字符到第j个字符组成的子串的最短折叠长度如果从i到j本身可以折叠,长度就是本身长度或折叠后的长度的最小值***此处参考:http://blog.csdn.net ...
- UVa 1630 Folding (区间DP)
题意:折叠一个字符串,使得其成为一个尽量短的字符串 例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...
- UVa 1630 区间DP Folding
一个字符串如果能简写,要么是重复多次,按题中的要求简写:要么是左右两个部分分别简写后再拼起来. dp(i, j)表示字串(i, j)所能被简写的最短的字符串. 判断一个字符串是否为周期串以及求出它的周 ...
- UVA 227 周期串
题意: 给一个字符串,寻找最短的循环节 如abcabcabcabc以3为周期,也按6和12为周期. 分析: 因为循环节肯定是相等的,所以枚举串长度的所有约数的循环节再判断是否相等即可. 我的方法是枚举 ...
- 【Uva 1630】Folding
[Link]: [Description] 你能对字符串进行压缩的操作; 即把连续出现的相同的子串改成它出现的次数+这个最基本的字符串的形式; 问你这个字符串最短能被压缩得多短; [Solution] ...
- Uva 11584,划分成回文串
题目链接:https://uva.onlinejudge.org/external/115/11584.pdf 题意: 一个字符串,将它划分一下,使得每个串都是回文串,求最少的回文串个数. 分析: d ...
随机推荐
- xcode中使用正则表达式来搜索替换代码
有这样的需求: 类似于 GLOBAL_STR(@"请继续添加"); 这样的代码,需要批量修改为: GLOBAL_STR(@"请继续添加", nil); 这里使用 ...
- id to load is required for loading
id一般作为主键,不为空.springmvc hibernate 框架中根据参数ids执行批量删除的方法时报错,ids是id主键的数组集合.去搜了下,原因别的博客说了,是id为空引起的.实际上id不为 ...
- BasicDataSource的配置参数
参数 描述 username 传递给JDBC驱动的用于建立连接的用户名 password 传递给JDBC驱动的用于建立连接的密码 url 传递给JDBC驱动的用于建立连接的URL driverClas ...
- oracle+servlet+extjs4 分页表格布局示例代码
Log.java package com.example.entity; import java.util.Date; public class Log { private int id; priva ...
- 让超出父视图范围的子视图响应事件,在UIView范围外响应点击
/** * 在父视图中重写该方法,这样可使超出部分响应事件. */ - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { ...
- linq实现数组转符号分割的字符串(备忘)
fitemidstr = string.Join(",", detailpre1.Select(i => i.Key.ToString()).ToArray());
- 百度echarts
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>ECharts</t ...
- Mongodb在windows下的安装和启动
在windows下安装的参考官方地址:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/ Mongodb的安装与启 ...
- Python之路----------内置函数
1.abs(x)绝对值 #coding=utf-8 a = 1 b = -2 print(abs(a)) print(abs(b)) 2.all(iterable)可迭代对象里面所有内容为真返回真,空 ...
- Object转数组
int length = Array.getLength(value);String[] newarray = new String[length];for (int i = 0; i < le ...