P4302 [SCOI2003]字符串折叠
题目描述
折叠的定义如下:
- 一个字符串可以看成它自身的折叠。记作S = S
- X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) = SSSS…S(X个S)。
如果A = A’, B = B’,则AB = A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) = AAACBB,而2(3(A)C)2(B) = AAACAAACBB
给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。
输入输出格式
输入格式:
仅一行,即字符串S,长度保证不超过100。
输出格式:
仅一行,即最短的折叠长度。
输入输出样例
NEERCYESYESYESNEERCYESYESYES
14
说明
一个最短的折叠为:2(NEERC3(YES))
Solution:
本题考试时没搞出来。(话说老余$AK$了!,自己还是个蒟蒻'!`~`!`)
就是一个区间$DP$,我这里用记忆化搜索来实现。
巧妙运用一下字符串$string$类型。定义状态$f[i][j]$表示区间$[i,j]$折叠后的最短字符串,那么当$l==r$时,显然$f[l][r]==s[l]$,搜索时枚举断点递归,找到使原串折叠后的长度最短的断点,然后枚举折叠的长度,这里用到了$stringstream$(字符串输入输出流)定义中间变量$op$,这样就可以简单的进行字符串的赋值,每一次$f[l][r]$赋为$f[l][r],op$中长度最短的一个(代码中的$op.tellp()$返回的是当前$put$流指针的位置(类似的还有$tellg$,返回$get$流指针的位置),可以理解为$op$的尾指针位置,即它的长度)。
这样写的好处是简洁而且能简单输出折叠后的字符串(一模一样的题,只是输出的是字符串,洛谷搜:$UVA1630\;Folding$,$STL$大法好!)。
此时先为不会$stringstream$的小伙伴们,安利一波(我测试的代码):
#include<iostream>
#include<sstream> //stringstream所需的头文件
using namespace std;
int main(){
ios::sync_with_stdio(); //取消流同步是可以用的,完全和string输入输出流无关 stringstream op; //定义string输入输出流,任意变量和string互转
string p;
char s[]={"lalalavan"};
op<<s; //将char类型的字符串赋值给op
op>>p; //将op输出到p中
cout<<op.str()<<endl<<p<<endl; //两种输出方式 op.str("");
op.clear(); //对op清空必须两个都要用,可以自行尝试去掉一个,会出兮兮`~` string num="";
int n;
op<<num;op>>n; //将string类型转为int类型
cout<<n<<endl; //输出转换后的int类型
return ;
}
本题代码:
#include<bits/stdc++.h>
#define il inline
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define Min(a,b) ((a)>(b)?(b):(a))
#define INF 23333
using namespace std;
int n;
string s,f[][];
il int check(int l,int r){
int sl=r-l+;
For(k,,sl>>){
if(sl%k)continue;
bool f=;
For(i,l,r-k){
if(s[i]==s[i+k])continue;
f=;
break;
}
if(f)return k;
}
return ;
}
il string dfs(int l,int r){
if(!f[l][r].empty())return f[l][r];
if(l==r)return f[l][r]=s[l];
int mink,ansl=INF;
For(i,l,r-){
int len=dfs(l,i).size()+dfs(i+,r).size();
if(len<ansl)mink=i,ansl=len;
}
f[l][r]+=dfs(l,mink),f[l][r]+=dfs(mink+,r);
int k=check(l,r);
if(k){
stringstream op; //定义输入输出流
op<<(r-l+)/k<<"("<<dfs(l,l+k-)<<")"; //将后面一大串依次赋给op
if(op.tellp()<f[l][r].size()) op>>f[l][r]; //比较f[l][r]和op取长度最小的
}
return f[l][r];
}
int main(){
cin>>s;
n=s.size();
For(i,,n-) For(j,,n-)f[i][j].clear();
cout<<dfs(,n-).size();
return ;
}
P4302 [SCOI2003]字符串折叠的更多相关文章
- luogu P4302 [SCOI2003]字符串折叠
题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS-S(X个S). 如果A = A', B = ...
- 洛谷P4302 [SCOI2003]字符串折叠(区间dp)
题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...
- [SCOI2003]字符串折叠(区间dp)
P4302 [SCOI2003]字符串折叠 题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS ...
- BZOJ1090: [SCOI2003]字符串折叠
区间dp. 一种是分段dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 一种是这一段可以缩写dp[i][j]=min(dp[i][j],dp[i][l]+2+ca ...
- BZOJ 1090: [SCOI2003]字符串折叠 区间DP
1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- 【BZOJ1090】[SCOI2003]字符串折叠(动态规划)
[BZOJ1090][SCOI2003]字符串折叠(动态规划) 题面 BZOJ 洛谷 题解 区间\(dp\).设\(f[i][j]\)表示压缩\([i,j]\)区间的最小长度.显然可以枚举端点转移.再 ...
- 【bzoj1090】 [SCOI2003]字符串折叠
[bzoj1090] [SCOI2003]字符串折叠 2014年3月9日3,1140 Description 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S S 2. X(S)是X ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- bzoj 1090 [SCOI2003]字符串折叠(区间DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1090 [题意] 给定一个字符串,问将字符串折叠后的最小长度. [思路] 设f[i][j ...
随机推荐
- 【洛谷4424】[HNOI/AHOI2018] 寻宝游戏(位运算思维题)
点此看题面 大致题意: 给你\(n\)个\(m\)位二进制数.每组询问给你一个\(m\)位二进制数,要求你从\(0\)开始,依次对于这\(n\)个数进行\(and\)或\(or\)操作,问有多少种方案 ...
- geoWithin查询 多边形查询
$geoWithin查询 形状的表示 .$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示 都是坐标,第一个坐标 ...
- Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像(克隆和导入)
Windows环境下在Oracle VM VirtualBOX下克隆虚拟机镜像: 注:直接复制一个.vdi 虚拟硬盘再挂上去就可以,但Virtualbox居然提示UUID重复,无法使用. 则,可以通过 ...
- JavaScript中的confirm的用法
confirm()方法用于显示一个带有指定消息和ok以及取消按钮的对话框confirm(message,ok,cancel); message:表示在弹出框的对话框中现实的文本信息如果用户点击确定按钮 ...
- ArrayList集合例题,商品库存管理(集合)
创建车库集合,存进车 public class demo1 { String pinpai; String c; int s; } import java.util.ArrayList; class ...
- (转)国内外优秀的Web前端工程师
1. 国内外优秀的Web前端工程师 寻找Github.微博.知乎等技术社区上比较活跃.影响力大的圈内大神,供大家膜拜! 视野所限,未必全面,欢迎大家推荐.自荐. 排名不分先后,序号只为标记方便. 提供 ...
- 01_13_JSP编译指令
01_13_JSP编译指令 1. Directive Directive(编译指令)相当于在编译期间的命令 格式: <%@Directive 属性=”属性值”%> 常见的Directive ...
- SAP销售订单屏幕增强行项目屏幕增强
1.在vbap表中 append一个自定义结构,如下图: 2.TCODE:SE80 程序名:SAPMV45A 屏幕:8459 如图: 3.标记增强的屏幕字段 4.屏幕增强的位置 *& ...
- django项目实现第三方github登录
OAuth(开放授权 Open Authorization)是一个开放标准,允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方网站或分享他们数据的所有内容 ...
- 二、Shell 变量
Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的 ...