字符串排序 nyoj 1149

来源:互联网 发布:淘宝联盟 退运费 福袋 编辑:程序博客网 时间:2024/04/19 15:08
题目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;}

0 0
原创粉丝点击