题目链接: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;
}
浙公网安备 33010602011771号