题意:给一个序列a,a[ i ]表示当前在i位置,经过一次encode变到a[ i ]的位置。再给一个字符串,s0, s1, s2,...,sn-1(长度不够的用空格
补上)。s[ i ]在a[ i ]位置输出得到一个新的串,重复这个过程k次,求最后的串。
思路:我们首先找到对于每个a[ i ]经过几次encode回到原来的位置,存在cnt[a[ i ]]中,然后用(k-1)%cnt[ a[ i ] ] 最后确定str[ i ]最终在
哪个位置。最后注意下输入输出的格式就好。详见代码:
// file name: poj1026.cpp //
// author: kereo //
// create time: 2014年09月02日 星期二 14时48分12秒 //
//***********************************//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int MAXN=200+100;
const int inf=0x3fffffff;
#define L(x) (x<<1)
#define R(x) (x<<1|1)
int n,k;
int a[MAXN],cnt[MAXN];//记录每个数所在循环的元素个数
char str[MAXN],ans[MAXN];
int main()
{
while(~scanf("%d",&n) && n){
for(int i=0;i<n;i++){
scanf("%d",&a[i]); a[i]--;
}
while(~scanf("%d",&k) && k){
getchar();
gets(str);
int len=strlen(str);
if(len<n)
for(int i=len;i<n;i++) str[i]=' ';
k--;
int tmp;
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++) if(!cnt[a[i]]){
tmp=a[i]; cnt[tmp]++;
while(tmp!=i){
cnt[a[i]]++; tmp=a[tmp];
}
}
int pos;
for(int i=0;i<n;i++){
tmp=k%cnt[a[i]];
pos=a[i];
while(tmp--) pos=a[pos];
ans[pos]=str[i];
}
for(int i=0;i<n;i++)
printf("%c",ans[i]);
putchar('\n');
}
putchar('\n');
}
return 0;
}