字符串排序 nyoj 1149

题目http://acm.nyist.net/JudgeOnline/problem.php?pid=1149
 
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
string str,s;
int ll;
struct node{
	string len;
	int l;
}a[100001];


int com(struct node a,struct node b){
	return a.len<b.len;
}

void solve(int n,int m){
	if(a[n].len.length()==ll)return ;
	for(int i=n;i<=m;i++){
		a[i].len+=str[(a[i].l+a[i].len.length())%ll];//!!!!!
	}
	sort(a+n,a+m+1,com);
	for(int i=n;i<=m;i++){
   		if(a[i].len==a[i+1].len){
    		int j=i+2;
    		for(;j<ll;j++){
    			if(a[j].len!=a[i].len){
         			break;
    			}
    		}
    		j--;
    		solve(i,j);
    		i=j;
    	}
   	}
}

int main(){
	while(getline(cin,str)){
		ll=str.length();
		for(int i=0;i<ll;i++){
			a[i].len="";
			a[i].len+=str[i];
			a[i].l=i;
		}
		sort(a,a+ll,com);
    	for(int i=0;i<ll-1;i++){
    		if(a[i].len==a[i+1].len){
    			int j=i+2;
    			for(;j<ll;j++){
    				if(a[j].len!=a[i].len){
    					break;
    				}
    			}
    			j--;
    			solve(i,j);
    			i=j;
    		}
    	}
    	sort(a,a+ll,com);
	    string ans="";
	    for(int i=0;i<ll;i++){
	    	int t=a[i].l;
	    	int tmp=(ll+t)%ll;
	//    	cout<<a[i].len<<' '<<a[i].l<<' '<<tmp<<endl;
	    	if(tmp!=0){
	    		ans+=str.substr(tmp-1,1);
	    	}
	    	else{
	    		ans+=str.substr(tmp+ll-1,1);
	    	}
     	}
     	cout<<ans<<endl;
   	}
	return 0;
}

你可能感兴趣的:(字符串排序 nyoj 1149)