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 聚会游戏(细节处理)的更多相关文章

  1. UVA1610 PartyGame 聚会游戏(细节题)

    给出一组字符串D,要找一个字符串S使得D中一半小于等于S,另外一半大于S.输入保证一定有解.长度要尽量短,在此基础上字典序尽量小. 分类谈论,细节挺多的,比如'Z'. 其实直接暴就过了,没分类辣么麻烦 ...

  2. UVa 1610 聚会游戏

    https://vjudge.net/problem/UVA-1610 题意:输入一个n个字符串的集合D,找一个长度最短的字符串S,使得D中恰好有一半串小于等于S,另一半串大于S. 思路:先拍序,然后 ...

  3. UVA - 1610 Party Games(聚会游戏)(构造)

    题意:输入一个n(2<=n<=1000,n是偶数)个字符串的集合D,找一个长度最短的字符串S(不一定在D中出现),使得D中恰好一半串小于等于S,另一半串大于S.如果有多解,输出字典序最小的 ...

  4. Unity2D游戏开发之保卫萝卜

    保卫萝卜是2D塔防游戏里边的一个经典案例,这次去开发这个游戏,我们会尽力去实现和原版一样的功能,做好我们可以处理好的每一个游戏细节(比如塔攻击的集火目标优先攻击,与自动搜索,格子的三种处理逻辑,UI的 ...

  5. PokemonGo:LBS游戏开发

    写在前面 去吧!皮卡丘!小时候拥有一台任天堂是多少熊孩子的梦想,每个夜晚被窝里透出的微弱光线,把小小的童年带入另一个世界,家门口的鸟和狗,森林里的虫和瀑布,山洞里的超音蝠,带着小小的梦,走过一个个城市 ...

  6. final阶段140字评论1

    1.约跑app         此次演讲增加了摄像头演示的功能,所以界面可以看得更清楚,演示的比上次完整,流畅,约跑这个项目感觉对于我们颇有使用价值,大家现在都热爱跑                 ...

  7. 项目评价及第五周PSP的发布

         5TH 各组作品ALPHA发布体会       1:俄罗斯方块组做了主要功能,这个项目我自己原来拿c语言做过一部分,感觉此游戏细节特别多,逻辑思维需要组织,以为我的水准来说,感觉做的挺好的. ...

  8. unity3d泰斗破坏神2----课程列表

    免费 课时1:泰斗破坏神第一支预告视频 01:32免费 课时2:泰斗破坏神第二支预告视频 01:58第 1 章 : 游戏开始 用户登录 服务器选择课时3:游戏开始 用户登录 服务器选择课时4:素材介绍 ...

  9. cocos2dx中的层CCLayer

    什么是层,层在cocos2dx里是一个能处理触摸事件的CCNode,因为它负责用户交互,因此大部分游戏细节都在这个类中完成,所以我们经常派生这个图层来完成逻辑交互代码.当然如果你的图层不需要接受交互信 ...

随机推荐

  1. 有關WCF一個自認爲比較經典的博客

    无废话WCF入门教程四[WCF的配置文件] (http://www.cnblogs.com/iamlilinfeng/archive/2012/10/02/2710224.html) -------- ...

  2. [转]Eclipse快捷键_01_常用快捷键汇总

    (注:红色标出来的是经常使用到的快捷键,磨刀不误砍柴工啊...) 一.常用快捷键 Shift+Alt+L:  自动补全等号左边对象 .(用鼠标选中这一行,然后按组合键Shift+Alt+L,在弹出的对 ...

  3. input 限制输入

    只能输入数字 :<input type="text" onkeyup="value=value.replace(/[^\d]/g,'')" /> 只 ...

  4. Session 和cookie机制详解

    参考: http://blog.csdn.net/fangaoxin/article/details/6952954/ http://blog.csdn.net/hjc1984117/article/ ...

  5. bzoj 4766: 文艺计算姬 矩阵树定理

    题目: 给定一个一边点数为\(n\),另一边点数为\(m\),共有\(n*m\)条边的带标号完全二分图\(K_{n,m}\) 计算其生成树个数 \(n,m,p \leq 10^{18} ,p为模数\) ...

  6. C#创建DataTable的语法

    namespace EazyCMS.Web.admin { public partial class ceshi1 : System.Web.UI.Page { protected void Page ...

  7. Poj 1973 Software Company(二分+并行DP)

    题意:软件公司接了两个项目,来自同一个合同,要一起交付.该公司有n个程序猿来做这两个项目A和B,每个项目都被分为m个子项目,给定每个程序猿做一个A中的子项目需要的时间Xi秒,和做B中的子项目所需时间Y ...

  8. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  9. spring初始化顺序

    首先,Spring bean的默认加载顺序是怎么控制的 工程中有2个bean,A和B,其中必须先初始化A再初始化B,但是没有depend-on或者Order等方式去保证,只不过恰好刚好这么运行着没出事 ...

  10. javascript面向对象的测试实例