题目描述

给你一串由小写字母组成的字符串,希望你把它划分成一些小段,使得每一小段字符串中的字母

都不相同,并且希望分的段数尽量少。

然后,把这些小段按字典序排序后输出,中间由一个空格分隔。

例如:字符串 ”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 行每行表示一个字符串的拆分方案。

输入输出样例

输入样例#1:

4
facetiously
aaaaa
aba
babb
输出样例#1:

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 字符串划分的更多相关文章

  1. 计蒜客蓝桥杯模拟赛 后缀字符串:STL_map+贪心

    问题描述 一天蒜头君得到 n 个字符串 si​,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si​ 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来  ...

  2. NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)

    7划分数列(seq.pas/c/cpp) [题目描述] 给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小 [输入格式] 第一行两个正整数n,k 第二行为此数列ai [输出格式] ...

  3. Hidden (NOIP模拟赛)(字符串模拟QAQ)

    原题传送门 神奇的题目诶 原来以为字符串比较一定要O(NlogN) 结果发现可以均摊O(N) 首先我们来讲一讲原理 我们有3个指针i,j,k i=0,j=1,k=0 一开始我们不断对k+1直到找到ch ...

  4. 常州模拟赛d4t1 立方体

    题目描述 立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草.为了训练奶牛的合作精神,它 们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛. 游戏开始, ...

  5. 常州模拟赛d3t1 神在夏至祭降下了神谕

    题目描述 我们村子在过去的400年中,断绝与下界的接触,过着自给自足的生活. 夏至祭是一场迎接祖灵于夏季归来,同时祈求丰收的庆典. 村里的男人会在广场上演出夏之军和冬之军的战争.夏之军会打倒冬之军的大 ...

  6. 常州模拟赛d1t5 遗忘口令

    就像每个人都会遇到的问题一样,贝西忘了在 cowtube 上的口令.不过,她还记着一些关于口令 的信息.首先,她确定口令由小写字母组成,长度为 L.其次,这个密码是由几个单词组合而成 的.贝西一共认识 ...

  7. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  8. 常州模拟赛d5t3 appoint

    分析:这道题比较奇葩.因为字符串没有swap函数,所以一个一个字符串交换只有30分.但是我们可以不用直接交换字符串,而是交换字符串的指针,相当于当前位置是哪一个字符串,每次交换int,可以拿60分. ...

  9. 常州模拟赛d7t3 水管

    分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...

随机推荐

  1. Git 学习教程【转+总结】

    之前是在用SVN,现在因为小伙伴比较喜欢Git,所以也开始学习Git,很感谢 时光穿梭机 - 廖雪峰 的无私奉献.本文用来记录我在学习Git过程中的收获和笔记,廖雪峰大神的Git教程参考这里. 1.G ...

  2. js 双向绑定

    //双向绑定实例 <input name="" ng-bind-123="name" /> function DataBinder( object_ ...

  3. 成魔笔记1——先入IT,再成魔

    关于我为什么要写这个博客的原因,做一个简单的解释.因为报考的一时兴起,我选择了软件专业.可是三年下来,感觉自己没做多少事,也没收获到多少东西.很多时候都是老师讲什么,都是完全陌生的东西,跟不上教学的思 ...

  4. Kubenetes里pod和service绑定的实现方式

    我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令kubectl run. 本文介绍另一种方式 ...

  5. 解决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: ...

  6. DatePicker 注意点 1.不用v-model 用:value 2.配合on-change进行回调 3.初始值 当天的用 (new Date()).toLocaleDateString().replace(/\//g, '-')

    <DatePicker :value="formData.date" type="date" format="yyyy-MM-dd" ...

  7. chrom浏览器-F12使用方法二

    文摘摘自:https://blog.csdn.net/run65536/article/details/80568543 提示:右键点击图片选择在新窗口或新标签页中打开可查看大图. 一.Element ...

  8. crop层

    A是要进行剪裁的blob,B是参考,C是由A剪裁出来的输出. 模式1和模式2不同在于offset,模式1中每个dimension可以不同,模式2中用一个值表示了所有dimension的值. axis表 ...

  9. angstromctf -No libc for You

    0x00 syscall syscall函数原型为: int syscall(int number, ...) 其中number是系统调用号,number后面应顺序接上该系统调用的所有参数.大概意思是 ...

  10. shell脚本,awk替换{}里面的内容

    如何将oxo{axbxc}oxo{dxexf}oxo里面的{}里面的x 替换为; 用awk实现 [root@localhost 09-30]# echo 'oxo{axbxc}oxo{dxexf}ox ...