POJ3617 简单字符串

  三分之一的通过率的字符串

  题意为,输入一个S串,有一个空串T。对S串有两种操作,一是取出S串的头放入T串的尾,二是取出S串的尾放入T串的尾。要求是要使得T串的字典序最小。

  从题意来看是一个很明显的贪心思路。那么想到这一步其实比较接近答案了,但是需要注意的一点是当S串的头和尾相同的时候,那么这个时候我们当然也希望取出更小的字符,所以就需要比较下一个字符。但是如果指向头和尾的指针都分别往里前进一位的时候,这俩字符还是相同,咋办?这个情形。。。对,就是回文字符串。形同“ABCDCBA”这样的字符串。这个时候是指针不断地往里走,判断为回文字串的时候,两头任意取下一个即可。还有一种情形是类似于这样的串:“ABCCBA”以及“ABCABA”。这些都需要我们把指针不断地移动到中间的时候才能够判断出应该先取哪边的字串才能保证T串的字典序最小。

  

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 2000+10;
 7 char s[maxn];
 8
 9 void solve(int n)
10 {
11     int i,l,r,cnt;
12     l = 0;
13     r = n-1;
14     for(cnt=1; l<=r; cnt++)
15     {
16         bool left = false;
17         for(i=0; l+i<=r; i++)
18         {
19             if(s[l+i] < s[r-i])
20             {
21                 left = true;
22                 break;
23             }
24             else if(s[l+i] > s[r-i])
25             {
26                 left = false;
27                 break;
28             }
29             if((l+i == r-i) && s[l+i] == s[r-i])
30             {
31                 left = true;
32                 break;
33             }
34             if((l+i+1 == r-i) && s[l+i] == s[r-i])
35             {
36                 left = true;
37                 break;
38             }
39         }
40         //if(top == n-1) left = true;
41         if(left) putchar(s[l++]);
42         else putchar(s[r--]);
43         if(n % 80 != 0)
44             if(cnt % 80 == 0)
45                 printf("\n");
46     }
47 }
48
49 int main()
50 {
51     int n,i;
52     while(scanf("%d%*c",&n) == 1)
53     {
54         char x;
55         memset(s,0,sizeof(s));
56         for(i=0; i<n; i++)
57         {
58             scanf("%c%*c",&x);
59             s[i] = x;
60         }
61         s[i] = ‘\0‘;
62         solve(n);
63     }
64     return 0;
65 }

POJ3617 简单字符串,布布扣,bubuko.com

时间: 2024-10-26 10:10:26

POJ3617 简单字符串的相关文章

C 封装一个通用链表 和 一个简单字符串开发库

引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是C++写,界面是C#写.那时候刚进去评级我是中级,因为他问我关于系统锁和信号量都答出来.开发一段 时间,写C#也写的很溜.后面招我那个人让我转行就写C++和php,那时候就开始学习C++有关知识. 后面去四川工作了,开发安卓,用eclipse + java语法 + android jdk,开发前端,

poj 3077 Rounders 【简单字符串处理】

题意:就是4舍5入到最近的数. 题意有些难理解... 代码: #include <stdio.h> #include <string.h> char s[10]; int main() { int t, n; scanf("%d", &t); while(t --){ memset(s, 0, sizeof(s)); scanf("%s", s); int len = strlen(s); if(len == 1){ printf(&

简单字符串排序

简单字符串排序 Time Limit: 5000MS Memory limit: 100000K 题目描述 从键盘输入10个学生的姓名和成绩,请按字典序排列学生的姓名并输出(姓名和成绩对应关系保持不变). 输入 输入共11行,前10行每行是一个学生的姓名,最后一行是10个用空格分开的整数表示对应的10个学生成绩. 输出 输出姓名按字典序排列后的学生姓名和成绩,共10行,每个学生的姓名和成绩占一行,姓名和成绩间用逗号分开. 示例输入 Bush White Mark Jean Black Wood

1442: Neo 的简单字符串(字符串)

1442: Neo 的简单字符串 时间限制: 10 Sec 内存限制: 128 MB 提交: 9 解决: 3 统计 题目描述 Neo 给你一系列字符串,请你输出字符串中的不同单词个数以及总单词个数. 输入 多组输入,每组数据都是一行字符串(长度小于200),其中每个单词以空格隔开(单词都是小写字母组成). 输出 输出字符串中的不同单词个数以及总单词个数. 样例输入 i love china aa aa bb 样例输出 3 3 2 3 来源 LZ 提交讨论 #include<bits/stdc++

第一部分之简单字符串SDS(第二章)

一,什么是SDS? 1.引出SDSC字符串:c语言中,用空字符结尾的字符数组表示字符串简单动态字符串(SDS):Redis中,用SDS来表示字符串.在Redis中,包含字符串值的键值对在底层都是由SDS实现的首先,Redis使用C语言写的,但是Redis没有使用C语言传统的字符串表示,它自己构建了简单字符串的抽象类型来表示字符串. 2.SDS的定义一个sdshdr结构表示一个SDS值.结构如下:struct sdshdr {    //记录buf数组中已使用字节的数量    int len;  

洛谷-你的飞碟在这儿-简单字符串

题目描述 Description 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每个彗星起了一个名字,通过这些名字来决定这个小组是不是被带走的那个特定的小组(你认为是谁给这些彗星取的名字呢?).关于如何搭配的细节会在下面告诉你:你的任务是写一个程序,通过小组名和彗星名来决定这个小组是否能被那颗彗星后面的UFO带走. 小组名和彗星名都以下列方式转换

UVa 401 Palindromes(简单字符串)

简单的判断是否是回文串.镜像串,然后自己写的真费劲,没逃掉刘汝佳的书,这里的代码很有技巧性,特别值得学习,额,其实他书上的代码都很精简 Character Reverse Character Reverse Character Reverse A A M M Y Y B   N   Z 5 C   O O 1 1 D   P   2 S E 3 Q   3 E F   R   4   G   S 2 5 Z H H T T 6   I I U U 7   J L V V 8 8 K   W W

简单字符串

P1055 ISBN号码 题目描述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括 99 位数字. 11 位识别码和 33 位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码.ISBN码的首位数字表示书籍的出版语言,例如 00 代表英语:第一个分隔符-之后的三位数字代表出版社,例如 670670 代表维京出版社:第二个分隔符后的五位数字代表该书在该出版社的编号:最后一位

Java实验--关于简单字符串回文的递归判断实验

首先题目要求写的是递归的实验,一开始没注意要求,写了非递归的方法.浪费了一些时间,所谓吃一堑长一智.我学习到了以后看实验的时候要认真看实验中的要求,防止再看错. 以下是对此次的实验进行的分析: 1)递归是运用到了栈的思想 2)回文是一段从中间开始倒置的文字,回代的过程中出现不同的符号的时候就说明这段文字不是回文了 根据上面对回文判断的分析,就拿最简单的121来说,要每个字符判断直至2所在的位置,然后依次回代判断前面的1和后面的1的位置(上述的描述就类似于栈的思想). 有关于栈还有递归其实我并不熟