Sweety

Practice makes perfect

导航

POJ 1026 Cipher(群置换) (待解决)

Posted on 2014-11-29 13:33  蓝空  阅读(133)  评论(0编辑  收藏  举报

 

题目链接: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;
}