字符串排序
时间限制: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;
}