题目描述

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

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

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

例如:字符串 ”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. codevs 爱改名的小融

    都是三道水题 但我很难理解的是 string 能过 char 就WA 2967 题目描述 Description Wikioi上有个人叫小融,他喜欢改名. 他的名字都是英文,只要按顺序出现R,K,Y三 ...

  2. JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

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

  3. App Store中的开源游戏汇总

    这是国外达人收集的曾经在app store上出现过,或者还在app store上卖的iOS开源游戏的列表,其中代码大部分人你托管在google code或者github上,其中有很多使用Cocos2D ...

  4. java 中设计模式

    1. 单例模式(一个类只有一个实例) package ch.test.notes.designmodel; /** * Description: 单例模式 (饿汉模式 线程安全的) * * @auth ...

  5. pc端引入微信公众号文章

    最近做了一个小需求,结果坑特别多..... 需求是这样的,要给公司内部做一个微信公众号广告投票系统,整个项目就不多赘述了,有个小功能,要求是这样的: 点击某条记录后的“投票”按钮,在当前页面弹出弹窗显 ...

  6. 多进程Queue

    进程间通讯 不同进程间内存是不共享的,要想实现两个进程间的数据交换,可以用以下方法: Queues 使用方法跟threading里的queue差不多 from multiprocessing impo ...

  7. Java MiniUi datagrid加载数据时,如果使用virtualScroll="false",数据多一点可能就会加载不出来

    datagrid的值为 virtualScroll="true" 问题解决.

  8. LeetCode || 大杂烩w

    454. 4Sum II 题意:给四个数组,每个数组内取一个数使得四个数和为0,问有多少种取法 思路:枚举为On4,考虑两个数组,On2枚举所有可能的和,将和的出现次数存入map中,On2枚举另两个数 ...

  9. 【计算机网络】DNS的作用以及修改DNS的方法

    1.DNS的作用及修改DNS的方法 1.1.DNS的作用 DNS就是将域名映射成ip的分布式数据库服务器,它的作用如下图: 1.2.修改DNS的方法 常用的DNS服务器 1.114.114.114.1 ...

  10. Python、机器学习、计算机视觉、深度学习入门

    1.简明Python教程 2.Python计算机视觉编程 3.机器学习实践 4.吴恩达机器学习 5.李飞飞深度学习与计算机视觉