POJ 1026 Cipher

虽然我知道这是一道很水的置换群的题,只要把每个循环求出来然后将k对循环节长度取余就可以得出repeat k次后的置换了。

可是……为毛putchar会吃空格啊,你一个输出代码不好好输出吃我空格干嘛,吃空格就算了,胃口还那么小,一下只吃一个,两个以上不吃,调了半个小时不知道为什么中间缺了个空格,简直了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N=200+5;
int next[N],a[N];
vector<int>v;
bool vis[N];
void dfs(int x){
	if(vis[x])return;
	vis[x]=true;
	v.push_back(x);
	dfs(next[x]);
}
char s[N],ans[N];
int main(){
	//freopen("a.in","r",stdin);
	int n;
	while(scanf("%d",&n)&&n){
		for(int i=1;i<=n;i++)
		scanf("%d",&next[i]);
		int k;
		while(scanf("%d",&k)&&k){
			getchar();
			memset(vis,0,sizeof(vis));
			for(int i=1;i<=n;i++)
			if(!vis[i]){
				v.clear();dfs(i);
				int tmp=k%v.size();
				for(int j=0;j<v.size();j++)
				a[v[j]]=v[(j+tmp)%v.size()];
			}
			for(int i=1;i<=n;i++)s[i]=ans[i]=0;
			gets(s+1);
			for(int i=1;i<=n;i++)
			ans[a[i]]=s[i];
			for(int i=1;i<=n;i++)
			if(ans[i])putchar(ans[i]);
			else putchar(' ');
			putchar('\n');
		}
		putchar('\n');
	}
	return 0;
}
	


你可能感兴趣的:(POJ 1026 Cipher)