nyoj-1149-字符串排序

字符串排序

时间限制:2000 ms  |  内存限制:65535 KB

难度:3

描述

给出一个长为len的字符串str,把字符串的首尾相连,然后以每个字符为起点,顺时针遍历每个字符,得到len个新的字符串,然后把这len个字符串按照字典序从小到大的顺序进行排序,取出排完序后的每个字符串的最后一个字符,形成一个新的字符串S。求S。

如下图。假设str=“topcoder”,则得到的新的字符串有

topcoder, opcodert, pcoderto, codertop, odertopc, dertopco, ertopcod, rtopcode,按字典序排完序为

codertop, dertopco, ertopcod, odertopc, opcodert, pcoderto, rtopcode, topcoder,

则取出每个字符串最后一个字符之后形成的字符串为podctoer,即S = “podctoer”。

输入

多组测试数据。
每组测试数据包括一个字符串,长度不超过100000。字符串由所有可打印字符组成。

输出

每组数据占一行,输出S。

样例输入

topcoder
I LOVE YOU

样例输出

podctoer
IEVU YLOO 

第一次做时考虑用STL中的multiset的自动排序的功能,但内存超过了最大限制,于是考虑用链表来节省内存,具体代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_NUM 100005
struct node
{
    char value;
    struct node * next;
}a[MAX_NUM];

int n;
char b[MAX_NUM];

int cmp(const void *a,const void *b)
{
    struct node *c = (struct node *)a;
    struct node *d = (struct node *)b;
    /*char t1[MAX_NUM],t2[MAX_NUM];
    int j = 0;
    while(j<n)
    {
        t1[j] = c->value;
        t2[j] = d->value;
        c = c->next;
        d = d->next;
        ++j;
    }
    return strcmp(t1,t2);
    */
    c = c->next;
    d = d->next;
    for(int j=0;j<n;j++)
        if(c->value != d->value)
            return c->value - d->value;
        else
        {
            c = c->next;
            d = d->next;
        }

    return 0;
}

int main()
{
    int i;
    struct node **NODE = (struct node **)malloc(sizeof(struct node *) * MAX_NUM);
    for(i=0;i<MAX_NUM;i++)
    {
        NODE[i] = (struct node *)malloc(sizeof(struct node));
        NODE[i]->next = NULL;
    }
    while(gets(b) != NULL)
    {
        n = strlen(b);
        NODE[0]->value = b[0];
        for(i=1;i<n;i++)
        {
            NODE[i]->value = b[i];
            NODE[i-1]->next = NODE[i];
        }
        NODE[n-1]->next = NODE[0];
        
        for(i=0;i<n;i++)
        {
            a[i].next = NODE[i];
            if(i==0)
                a[i].value = NODE[n-1]->value;
            else
                a[i].value = NODE[i-1]->value;
        }
        
        qsort(a,n,sizeof(a[0]),cmp);
        for(i=0;i<n;i++)
            printf("%c",a[i].value);
        printf("\n");

    }
    /*for(i=0;i<MAX_NUM;i++)
    {
        free(NODE[i]);
    }
    free(NODE);
    */
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011514451/article/details/81204573