码迷,mamicode.com
首页 > 编程语言 > 详细

字符串排序(nyoj 1149)

时间:2016-05-13 01:20:42      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

要求每一个字符串按字典序排列,结尾输出字符串的最后一位,只要将字符串取到能进行比较的程度就行了,不用全部比较。

主要是递归的思想,不断地对相同的区间继续比较,直到都有序。

<span style="font-size:18px;">#include<string>
#include<string.h>
#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
char c[100010];
struct node{
	string s;
	int n;
	bool operator <(const node& x)const{
		return s<x.s;
	}
}a[100010];
int len;
void solve(int x,int y);
void output();
int main(){
	while(gets(c)){	//这样可以结束 
		len = strlen(c);
		for(int i=0;i<len;i++){	//存首字母 
			a[i].s = c[i];
			a[i].n = i;
		}
		sort(a,a+len);	//排序 
		for(int i=1;i<len;i++){	//比较 
			if(a[i].s==a[i-1].s){	//若首字母相同 
				int j=i+1;
				for(;j<len;j++){	//查找相同的区间 
					if(a[j].s!=a[i].s)	break;
				}
				j--;	//记得要取前一个 
				solve(i-1,j);	//对区间进行处理排序 
				i = j;	//跳过区间 
			}	
		}
		output();
	}
	return 0;
}

void output(){
	for(int i=0;i<len;i++){	//根据首地址输出尾字符 
		printf("%c",c[(a[i].n+len-1)%len]);
	}
	printf("\n");
}

void solve(int x,int y){
	if(a[x].s.size()==len)	return ;	//当字符串和原字符串相等,则不进行比较了(输出结果会相同,不用计较这一个区间的排序) 
	for(int i=x;i<=y;i++){	//该字符串加上下一个字符进行比较 
		a[i].s += c[(a[i].n+a[i].s.size())%len];
	}
	sort(a+x,a+y+1);	//对该区间排序 
	for(int i=x+1;i<=y;i++){	//继续比较 重复这一过程 直到都有序 
		if(a[i].s==a[i-1].s){
			int j=i+1;
			for(;j<len;j++){
				if(a[j].s!=a[i].s)	break;
			}
			j--;
			solve(i-1,j);
			i = j;
		}	
	}
}</span>



字符串排序(nyoj 1149)

标签:

原文地址:http://blog.csdn.net/woyuhuaijin/article/details/51347774

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!