uva1610 聚会游戏(细节处理)
uva1610 聚会游戏(细节处理)
输入一个n(n<=1000且为偶数)个字符串的集合D,找一个长度最短的字符串(不一定要在D中出现)S,使得D中恰好一半字符串小于等于S,另一半大于S。如果有多解,输出字典序最小的解。
首先找到两个中位字符串S1和S2。显然,答案S必须夹在S1和S2之间。由于要找最短的字符串,我们可以用迭代加深的思路,根据|S|迭代加深枚举。每次枚举长度时,必须保证S的前|S|-1位和S1相同,然后最后一位枚举26个字符。这是一个贪心,应该不难证。我用了第k大数和跳过公共前缀部分来加速。
#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
const int maxn=1005;
int n;
string a[maxn], s1, s2;
void getstr(int l, int r, int ord, string &str){
if (l>=r) return;
string base=a[(l+r)>>1]; int now=l;
for (int i=l; i<r; ++i) //比base小的区间是[l,tmp)
if (a[i]<base) swap(a[i], a[now++]);
int tmp=now;
for (int i=tmp; i<r; ++i) //等于base的区间是[tmp,now)
if (a[i]==base) swap(a[i], a[now++]);
if (ord<tmp) getstr(l, tmp, ord, str);
else if (ord>=now) getstr(now, r, ord, str);
else str=a[tmp];
}
string getpre(string s1, string s2){
string s("");
if (s1.size()>s2.size()) swap(s1, s2);
for (int i=0; i<s1.size(); ++i)
if (s1[i]==s2[i]) s+=s1[i]; else break;
return s;
}
int main(){
//注意半开区间取中值的方法和闭区间不同!
while (~scanf("%d", &n)&&n){
for (int i=0; i<n; ++i) cin>>a[i];
//获取两个中位字符串 复杂度O(n|s|) s=30
getstr(0, n, n/2-1, s1); getstr(0, n, n/2, s2);
string s=getpre(s1, s2); int cur=s.size();
if (s>=s1&&s<s2){ cout<<s<<endl; continue; }
while (true){
for (char c=s[cur]; c<='Z'; ++c)
if (s+c>=s1&&s+c<s2){
cout<<s+c<<endl; goto end; }
s+=s1[cur++];
}
end:;
}
return 0;
}
uva1610 聚会游戏(细节处理)的更多相关文章
- UVA1610 PartyGame 聚会游戏(细节题)
给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S.输入保证一定有解.长度要尽量短,在此基础上字典序尽量小. 分类谈论,细节挺多的,比如'Z'. 其实直接暴就过了,没分类辣么麻烦 ...
- UVa 1610 聚会游戏
https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后 ...
- UVA - 1610 Party Games(聚会游戏)(构造)
题意:输入一个n(2<=n<=1000,n是偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中恰好一半串小于等于S,另一半串大于S.如果有多解,输出字典序最小的 ...
- Unity2D游戏开发之保卫萝卜
保卫萝卜是2D塔防游戏里边的一个经典案例,这次去开发这个游戏,我们会尽力去实现和原版一样的功能,做好我们可以处理好的每一个游戏细节(比如塔攻击的集火目标优先攻击,与自动搜索,格子的三种处理逻辑,UI的 ...
- PokemonGo:LBS游戏开发
写在前面 去吧!皮卡丘!小时候拥有一台任天堂是多少熊孩子的梦想,每个夜晚被窝里透出的微弱光线,把小小的童年带入另一个世界,家门口的鸟和狗,森林里的虫和瀑布,山洞里的超音蝠,带着小小的梦,走过一个个城市 ...
- final阶段140字评论1
1.约跑app 此次演讲增加了摄像头演示的功能,所以界面可以看得更清楚,演示的比上次完整,流畅,约跑这个项目感觉对于我们颇有使用价值,大家现在都热爱跑 ...
- 项目评价及第五周PSP的发布
5TH 各组作品ALPHA发布体会 1:俄罗斯方块组做了主要功能,这个项目我自己原来拿c语言做过一部分,感觉此游戏细节特别多,逻辑思维需要组织,以为我的水准来说,感觉做的挺好的. ...
- unity3d泰斗破坏神2----课程列表
免费 课时1:泰斗破坏神第一支预告视频 01:32免费 课时2:泰斗破坏神第二支预告视频 01:58第 1 章 : 游戏开始 用户登录 服务器选择课时3:游戏开始 用户登录 服务器选择课时4:素材介绍 ...
- cocos2dx中的层CCLayer
什么是层,层在cocos2dx里是一个能处理触摸事件的CCNode,因为它负责用户交互,因此大部分游戏细节都在这个类中完成,所以我们经常派生这个图层来完成逻辑交互代码.当然如果你的图层不需要接受交互信 ...
随机推荐
- 一 Django框架介绍——用pycharm创建Django项目
Django框架介绍 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C.它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内 ...
- kylin_学习_01_kylin安装部署
一.环境准备 根据官方文档,kylin是需要运行在hadoop环境下的,如下图: 1.hadoop环境搭建 参考:hadoop_学习_02_Hadoop环境搭建(单机) 2.hbase环境搭建 参考: ...
- ATL com的dll文件与tlb文件
一..tlb文件: 只有COM组件才有tlb文件,普通dll文件没有. 包含内容: 1.它包含了COM类和接口的GUID值,接口的函数声明信息,并不是接口的实现文件.相当于类和接口的头文件. tlb文 ...
- 【遍历二叉树】05二叉树的层次遍历II【Binary Tree Level Order Traversal II】
就把vector改成用栈类存放层次遍历的一层的序列 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...
- bzoj 4816 数字表格 —— 反演
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4816 推导过程同:http://www.cnblogs.com/zhouzhendong/p ...
- Log4Net日志记录介绍
原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...
- poj 2105 IP Address(水题)
一.Description Suppose you are reading byte streams from any device, representing IP addresses. Your ...
- virtual judge(专题一 简单搜索 C)
Description Farmer John has been informed of the location of a fugitive cow and wants to catch her i ...
- JVM体系结构之六:堆Heap之1
一.简介 对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块.Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放 ...
- 人物-IT-史玉柱:史玉柱
ylbtech-人物-IT-史玉柱:史玉柱 史玉柱,1962年9月15日生于安徽省蚌埠市怀远县,商人.企业家. 1984年从浙江大学数学系本科毕业,分配至安徽省统计局工作.1989年深圳大学软件科学系 ...