题目链接:http://poj.org/problem?id=1026
题目大意:
给出1~n的置换序列, 然后给出一个整数k,和一个串
问置换k次后的串是什么样子的。
首先,给出的串的长度是小于等于n的,不足的位置要补上空格。
然后置换k次,不是直接就循环着置换,因为置换内的每个循环都是有一定长度的,如果超过这个长度的置换次数,必然会和前面的某个状态一样,所以对每个循环,如果长度为len,循环内的元素只需要置换k%len次即可。
开始用的结构体排序,结果果断超时
#include <iostream> #include <algorithm> #include <cstdio> #include <string> #include <cstring> #include <cmath> using namespace std; struct TT{ int num; char ch; } seq[210]; bool cmp(TT a ,TT b ){ return a.num<b.num; } int main() { while(1){ int i,n,sseq[210]; scanf("%d",&n); for(i=0;i<n;i++){ // cout<<"..............."<<endl; scanf("%d",&seq[i].num);//输入次序 sseq[i]=seq[i].num; } if(n==0) break; int k; while(cin>>k){//~scanf("%d",&k)){ if(k==0) break; char a[210],b[210],aaa; int j; memset(a,' ',sizeof(a)); scanf("%c",&aaa); gets(a); if(strlen(a)<n) a[strlen(a)]=' '; for(j=0;j<n;j++) seq[j].ch=a[j]; while(k--){///执行完之后k到底是多少 sort(seq,seq+n,cmp); for(i=0;i<n;i++) seq[i].num=sseq[i]; } for(i=0;i<n;i++) printf("%c",seq[i].ch); printf("\n"); } } return 0; }
修改的代码(未完成)
#include <iostream> #include <algorithm> #include <cstdio> #include <string> #include <cstring> #include <cmath> using namespace std; int main() { while(1){ int i,n,seq[210],test[210],testsq[210]; scanf("%d",&n); for(i=0;i<n;i++){ scanf("%d",&seq[i]);///输入次序 testsq[i]=--seq[i]; } if(n==0) break; int k; while(cin>>k){//~scanf("%d",&k)){ if(k==0) break; char a[210],aaa,testch[210]; int j; memset(a,' ',sizeof(a)); scanf("%c",&aaa); ///收取空格 gets(a); if(strlen(a)<n) a[strlen(a)]=' '; for(i=0;i<n;i++) { int ccount=1; int road[210]; int aa=testsq[seq[i]]; testsq[seq[i]]=seq[i]; cout<<"***************************************"<<endl; while(1) ///查找周期 { if(aa==testsq[seq[i]])///两次相同的话 break; aa=seq[aa]; testsq[seq[i]]=seq[i]; road[i]=seq[i]; ccount++; } int temp=road[k%ccount]; testch[temp]=a[i]; } for(i=0;i<n;i++) printf("%c",testch[i]); printf("\n"); } } return 0; }