标签:
要求每一个字符串按字典序排列,结尾输出字符串的最后一位,只要将字符串取到能进行比较的程度就行了,不用全部比较。
主要是递归的思想,不断地对相同的区间继续比较,直到都有序。
<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>
标签:
原文地址:http://blog.csdn.net/woyuhuaijin/article/details/51347774