sdustoj 规范序排列

Description

规范序是一种对字符串比较的排序规则,定义如下:

1 串长小的排在前面;

2 相同串长的按照字典序排列顺序。

串的字典序遵循如下递归定义:

1 两串的前n-1个字符相同,第n个字符字典序小的排在前面;

2 只有两串的字符完全相同时,才有两串相等。

字符的字典序即按照字母排列的顺序,即a, b, ..., z。ASCII码范围内的字符串的字典序比较可以用strcmp()函数(原型和功能见HINT)完成。

Input

第一行输入为一个整数N(N<=100),后接N行,每行一个字符串。每个字符串仅由小写字母“a”~“z”组成,长度不超过10个字符。

Output

输出为N行,按照字符串的规范序排列,规范序小的排前面。

Sample Input

10

abc

bc

aca

ca

c

aac

aba

bc

da

ba

Sample Output

c

ba

bc

bc

ca

da

aac

aba

abc

aca

HINT

原型: int strcmp(const char *s1,const char * s2);

功能:比较字符串s1和s2。

  当s1<s2时,返回值<0

  当s1==s2时,返回值=0

  当s1>s2时,返回值>0

在拿到题目的瞬间,自己就暗示自己不会做,其实想想就是一个简单的排序。

代码如下:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<ctype.h>
 4 int main()
 5 {
 6     int m;
 7     scanf("%d",&m);
 8     getchar();
 9     char a[100][100]={0};
10     int i;
11     for(i=0;i<m;i++)
12         gets(a[i]);
13     int j;
14     int x,y;
15     char s[110]={0};
16     for(i=0;i<m;i++)
17         for(j=0;j<m-i;j++)
18     {
19         x=strlen(a[j]);
20         y=strlen(a[j+1]);
21         if(x>y)
22         {
23             strcpy(s,a[j]);
24             strcpy(a[j],a[j+1]);
25             strcpy(a[j+1],s);
26         }
27         else if(x==y)
28         {
29             if(strcmp(a[j],a[j+1])>0)
30             {
31                 strcpy(s,a[j]);
32             strcpy(a[j],a[j+1]);
33             strcpy(a[j+1],s);
34             }
35         }
36     }
37     for(i=0;i<m;i++)
38         printf("%s\n",a[i]);39      return 0;
40 }

不能用数组存储字符串的长度,因为在进行字符串交换时,数组中存储的长度并没有交换。

时间: 2024-11-29 01:25:03

sdustoj 规范序排列的相关文章

codevs 1013 求先序排列(二叉树遍历)

传送门 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). Input 两个字符串,分别是中序和后序(每行一个) Output 一个字符串,为二叉树的先序序列 Sample Input BADC BDCA Sample Output ABCD 思路 我们知道,前序遍历(PreOrder):根节点->左子树->右子树:中序遍历(InOrder):左子树->根节点->右子树:(PostOrder)后序遍历:左

算法题:一个N字节的数,如何逆序排列各个位(bit)?例如1字节的数 0010 0011 =&gt; 1100 0100

一个简简单单的题,如果用Java,C++,C估计还挺麻烦的,大体思路就是,开辟个N字节空间,用移位掩码方法逆向给每个bit赋值,这里由于N可能比较大,还得记录些额外的边界信息. 用Erlang则会简单很多: -module(bitoperator). -export([bit_reverse/1]). bit_reverse(Bin) -> L = [X || <<X:1>> <= Bin], Lr = lists:reverse(L), Br = list_to_bi

codevs 1013 求先序排列 2001年NOIP全国联赛普及组 x

题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input Description 两个字符串,分别是中序和后序(每行一个) 输出描述 Output Description 一个字符串,先序 样例输入 Sample Input BADC BDCA 样例输出 Sample Output ABCD 数据范围及提示 Data Size & Hint 分类标签 Tags 点此展开 #include<

求先序排列

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入描述 Input Description 两个字符串,分别是中序和后序(每行一个) 输出描述 Output Description 一个字符串,先序 样例输入 Sample Input BADC BDCA 样例输出 Sample Output ABCD 数据范

Shell练习 统计单词个数,降序排列

原文:https://leetcode.com/problems/word-frequency/ Write a bash script to calculate the frequency of each word in a text file words.txt. For simplicity sake, you may assume: words.txt contains only lowercase characters and space ' ' characters. Each wo

AS3.0 扑克牌乱序排列法洗牌

package { /* *@ClassName:package::PokerMain *@Intro:这是一个初始化1-52扑克牌,然后进行乱序排列进行洗牌: *@Author:非若 *@Date:2015.07.22 *@LanguageVersion:ActionScript 3.0 * */ import flash.display.Sprite; public class PokerMain extends Sprite { //设置扑克牌总数 private var NUM:Numb

C++用非递归实现二叉树的前序排列,中序排列,后续排列

前序排列的非递归实现: Template<class T> Void PreOrder(BinaryTreeNode<T> *t) { stack <BinaryTreeNode<T> *> S(Maxlength); BinaryTreeNode<T> *p=t; do{ while(p){ visit(p);//访问P S.Add(p); p=p->LeftChild; } If(!S.IsEmpty()){ S.Delete(p);

10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。

题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). 关于中位数:数据排序后,位置在最中间的数值.即将数据分成两部分,一部分大于该数值,一部分小于该数值.中位数的位置:当样本数为奇数时,中位数=(N+1)/2 ; 当样本数为偶数时,中位数为N/2与1+N/2的均值(那么10G个数的中位数,就第5G大的数与第5G+1大的数的均值了). 分析:明显是一道工

51Nod 1020 逆序排列

 1020 逆序排列 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4. 1-n的全排列中,逆序数最小为0(正序),最大为n*(n-1) / 2(倒序) 给出2个数n和k,求1-n的全排列中,逆序数为k的排列有多少种? 例如:n = 4 k = 3. 1 2 3 4的排列中逆序为3的共有6个,分别是: 1 4 3 2 2 3 4 1