题目描述

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

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

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

例如:字符串 ”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. 使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

    程序员面试系列 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Java Mar ...

  2. osx launchpad图标的删除

    安装了个parallels desktop之后,OSX中的launchpad中的图标多了不少,可是好多都不是我自己想要的,我们该怎么删除或者修改呢,下面介绍一些方法: ①直接操作Appications ...

  3. VGG16学习笔记

    转载自:http://deanhan.com/2018/07/26/vgg16/ 摘要 本文对图片分类任务中经典的深度学习模型VGG16进行了简要介绍,分析了其结构,并讨论了其优缺点.调用Keras中 ...

  4. 数组、Math、JOSN总结

    json对象: 1.数组有length属性[尽量使用for循环] 2.而json没有length属性[可以使用for...in...循环] 3.for in 不能遍历页面中的节点对象. for ( v ...

  5. 使用js将后台返回的数据转换成树形结构

    将类似如下数据转换成树形的数据: [ { id: 1, name: '1', }, { id: 2, name: '1-1', parentId: 1 }, { id: 3, name: '1-1-1 ...

  6. shell脚本,实现奇数行等于偶数行。

    请把如下字符串stu494e222fstu495bedf3stu49692236stu49749b91转为如下形式:stu494=e222fstu495=bedf3stu496=92236stu497 ...

  7. UVa 291 The House Of Santa Claus——回溯dfs

    题意:从左下方的1开始,一笔画出圣诞老人的房子. #include <iostream> #include <cstring> using namespace std; ][] ...

  8. C++后台知识点总结(一)

    C++基础部分: 1.数组和指针的区别 (1)数组本身体现出来的就是一个 指针常量的 “特性”,即不能对数组的首地址进行修改,内存上的地址就已经是确定了的.而指针本身是一个变量,他指向了一个地址,这个 ...

  9. Linux 永久修改主机名hostname

    前言: 由于最近用3台机器,经常切换导致有容易区别的需求. 故想修改主机名. 实验环境:Ubuntu 17 教程: 1. 使用hostname 命令先临时修改 sudo hostname your_n ...

  10. mysql:破解MySQL密码的一种方法

    1, 修改mysql配置文件/etc/my.cnf 12 [mysqld]skip_grant_tables 2, 重启mysql后直接用root用户登录(不用输入密码) 1 $ mysql -uro ...