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