常州模拟赛d4t3 字符串划分
题目描述
给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母
都不相同,并且希望分的段数尽量少。
然后,把这些小段按字典序排序后输出,中间由一个空格分隔。
例如:字符串 ”nnsmpmn”,最少分成 3 小段:”n”,”nsmp”,”mn”。
排序后输出:mn n nsmp
注意,有时候符合上面要求的方案可能有多个,就要输出排序后字典序最小的那个。
例如:字符串 ”aba” 可以有 2 种划分:a/ba 和 ab/a,排序后分别是:”a ba” 和 ”a ab”。
应该输出:a ab
输入输出格式
输入格式:
第一行包含 1 个正整数 k,表示有 k 组任务。
之后 k 行每行包含 1 个由小写字母组成的字符串 S。
输出格式:
共 k 行每行表示一个字符串的拆分方案。
输入输出样例
4
facetiously
aaaaa
aba
babb
facetiously
a a a a a
a ab
ab b b
说明
对于 30% 的数据:|S| ≤ 10; 对于 100% 的数据:k ≤ 10,|S| ≤ 50。
分析:细节题害死人QAQ.
显然这是一道dp题,设f[i]为1~i位的最优结果,要记录一个二元组:分了多少个、分的字符串是啥,然后f[i] = min{f[j] + t},这个加法和min要我们自己来定义.总之就是细节题.
以后不要轻易用string了,在类里面开一个string数组总是报错.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <cmath> using namespace std; int k;
bool vis[];
char S[]; struct node
{
int tot;
char ss[];
}; struct node2
{
int cnt;
node s[];
}f[]; bool cmp2(node a, node b)
{
for (int i = ; i <= min(a.tot, b.tot); i++)
{
if (a.ss[i] != b.ss[i])
return a.ss[i] < b.ss[i];
}
return a.tot < b.tot;
} bool cmp(node2 a, node2 b)
{
if (a.cnt != b.cnt)
return a.cnt < b.cnt;
for (int i = ; i <= a.cnt; i++)
return cmp2(a.s[i],b.s[i]);
} int main()
{
scanf("%d", &k);
while (k--)
{
scanf("%s", S + );
int sizee = strlen(S + );
for (int i = ; i <= sizee; i++)
f[i].cnt = sizee + ;
for (int i = ; i <= sizee; i++)
{
memset(vis, false, sizeof(vis));
for (int j = i - ; j >= ; j--)
{ if (vis[S[j + ] - 'a'])
break;
vis[S[j + ] - 'a'] = ;
node2 t = f[j];
t.cnt++;
for (int k = j + ; k <= i; k++)
{
t.s[t.cnt].tot++;
t.s[t.cnt].ss[k - j] = S[k];
}
sort(t.s + , t.s + + t.cnt, cmp2);
if (cmp(t, f[i]))
f[i] = t;
}
}
for (int i = ; i <= f[sizee].cnt; i++)
{
for (int j = ; j <= f[sizee].s[i].tot; j++)
cout << f[sizee].s[i].ss[j];
printf(" ");
}
cout << endl; } return ;
}
常州模拟赛d4t3 字符串划分的更多相关文章
- 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心
问题描述 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 ...
- NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
7划分数列(seq.pas/c/cpp) [题目描述] 给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小 [输入格式] 第一行两个正整数n,k 第二行为此数列ai [输出格式] ...
- Hidden (NOIP模拟赛)(字符串模拟QAQ)
原题传送门 神奇的题目诶 原来以为字符串比较一定要O(NlogN) 结果发现可以均摊O(N) 首先我们来讲一讲原理 我们有3个指针i,j,k i=0,j=1,k=0 一开始我们不断对k+1直到找到ch ...
- 常州模拟赛d4t1 立方体
题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...
- 常州模拟赛d3t1 神在夏至祭降下了神谕
题目描述 我们村子在过去的400年中,断绝与下界的接触,过着自给自足的生活. 夏至祭是一场迎接祖灵于夏季归来,同时祈求丰收的庆典. 村里的男人会在广场上演出夏之军和冬之军的战争.夏之军会打倒冬之军的大 ...
- 常州模拟赛d1t5 遗忘口令
就像每个人都会遇到的问题一样,贝西忘了在 cowtube 上的口令.不过,她还记着一些关于口令 的信息.首先,她确定口令由小写字母组成,长度为 L.其次,这个密码是由几个单词组合而成 的.贝西一共认识 ...
- 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串
3 字符串游戏(strGame.c/cpp/pas) 3.1 题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...
- 常州模拟赛d5t3 appoint
分析:这道题比较奇葩.因为字符串没有swap函数,所以一个一个字符串交换只有30分.但是我们可以不用直接交换字符串,而是交换字符串的指针,相当于当前位置是哪一个字符串,每次交换int,可以拿60分. ...
- 常州模拟赛d7t3 水管
分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...
随机推荐
- Git 学习教程【转+总结】
之前是在用SVN,现在因为小伙伴比较喜欢Git,所以也开始学习Git,很感谢 时光穿梭机 - 廖雪峰 的无私奉献.本文用来记录我在学习Git过程中的收获和笔记,廖雪峰大神的Git教程参考这里. 1.G ...
- js 双向绑定
//双向绑定实例 <input name="" ng-bind-123="name" /> function DataBinder( object_ ...
- 成魔笔记1——先入IT,再成魔
关于我为什么要写这个博客的原因,做一个简单的解释.因为报考的一时兴起,我选择了软件专业.可是三年下来,感觉自己没做多少事,也没收获到多少东西.很多时候都是老师讲什么,都是完全陌生的东西,跟不上教学的思 ...
- Kubenetes里pod和service绑定的实现方式
我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令kubectl run. 本文介绍另一种方式 ...
- 解决Starting to watch source with Jekyll and Compass. Starting Rack on port 4000
问题 Starting to watch source with Jekyll and Compass. Starting Rack on port 4000 rake aborted! Errno: ...
- DatePicker 注意点 1.不用v-model 用:value 2.配合on-change进行回调 3.初始值 当天的用 (new Date()).toLocaleDateString().replace(/\//g, '-')
<DatePicker :value="formData.date" type="date" format="yyyy-MM-dd" ...
- chrom浏览器-F12使用方法二
文摘摘自:https://blog.csdn.net/run65536/article/details/80568543 提示:右键点击图片选择在新窗口或新标签页中打开可查看大图. 一.Element ...
- crop层
A是要进行剪裁的blob,B是参考,C是由A剪裁出来的输出. 模式1和模式2不同在于offset,模式1中每个dimension可以不同,模式2中用一个值表示了所有dimension的值. axis表 ...
- angstromctf -No libc for You
0x00 syscall syscall函数原型为: int syscall(int number, ...) 其中number是系统调用号,number后面应顺序接上该系统调用的所有参数.大概意思是 ...
- shell脚本,awk替换{}里面的内容
如何将oxo{axbxc}oxo{dxexf}oxo里面的{}里面的x 替换为; 用awk实现 [root@localhost 09-30]# echo 'oxo{axbxc}oxo{dxexf}ox ...