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. python基础-条件语句if

    if语句: if 判断条件: 执行语句 else: 执行语句 flag = Falsename = 'huipaodexiong'if name == 'python':    flag = True ...

  2. Python基础-内置函数总结

    内置函数 int('123') float() string() tuple() set() dict(name='zdd',age=18) type()#查看类型 len()#看长度,其实是元素的个 ...

  3. codeforces 652D D. Nested Segments(离散化+sort+树状数组)

    题目链接: D. Nested Segments time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  4. STL stl_construct.h

    stl_construct.h // Filename: stl_construct.h // Comment By: 凝霜 // E-mail: mdl2009@vip.qq.com // Blog ...

  5. p2p视频点播系统开发案例――Myseelite

    项目地址:http://sourceforge.net/projects/myseelite/ 1. MySee公司倡导的开源项目,目前国内功能最强大的一个开源系统. 2. 一个直播(也支持轮播.点播 ...

  6. ACM学习历程—SNNUOJ1132 余数之和(数论)

    Description F(n) = (n % 1) + (n % 2) + (n % 3) + ...... (n % n).其中%表示Mod,也就是余数.例如F(6) = 6 % 1 + 6 % ...

  7. DEBUG命令说明

    Debug在学习汇编的过程中,担任着一个非常重要的角色,是一个极其重要的调试工具,所以学会它是必须得. 命令格式 功能说明 A [地址] 输入汇编指令 C [范围] 起始地址 对由“范围”指定的区域与 ...

  8. 使用Visual Studio进行单元测试-Part3

    本文主要介绍Visual Studio(2012+)单元测试框架的一些技巧: 测试覆盖率的统计 测试分组 测试Setup/TearDown 测试调试 Exception测试 代码覆盖率的统计 VS下面 ...

  9. jenkins pipline 用法收集

    1.下载多个项目 node { stage('clone'){ dir('test1'){ checkout([$class: 'GitSCM', branches: [[name: '*/maste ...

  10. Logstash 2.0.0 beta2 发布,开源日志管理

    Logstash 是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计. Logstash 现在是 ElasticSea ...