寻找置换群,然后找出置换后的序列。
#include <stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<stack>
#include<vector>
#define LL __int64
#define maxn 501
using namespace std;
int a[maxn];
int vis[maxn];
char str[maxn];
char ansstr[maxn];
int num,n;
void init()
{
int x;
for(int i=1; i<=n; i++)
{
scanf("%d%*c",&x);
a[x]=i;
}
}
void chustr()
{
int i,j;
int len=strlen(str);
num=0;
for(i=0; i<len; i++)
{
if(str[i]!=' ')num=num*10+str[i]-'0';
else break;
}
i++;
for(j=i; i<len; i++)
{
str[i-j+1]=str[i];
}
for(i=len-j+1; i<=n; i++)str[i]=' ';
}
void dos()
{
vector<int>vec;
int i,j;
int nums;
for(i=1; i<=n; i++)
{
if(vis[i])continue;
vec.clear();
j=i;
nums=0;
vec.clear();
while(!vis[j])
{
vis[j]=1;
vec.push_back(j);
j=a[j];
nums++;
}
nums=num%nums;
int lens=vec.size();
for(j=0; j<lens; j++)
{
ansstr[vec[j]]=str[vec[(j+nums)%lens]];
}
}
}
void print()
{
for(int i=1; i<=n; i++)cout<<ansstr[i];
cout<<endl;
}
int main()
{
int i,j;
while(scanf("%d%*c",&n)&&n)
{
init();
while(gets(str))
{
if((strlen(str)==1)&&str[0]=='0')break;
chustr();
dos();
memset(vis,0,sizeof(vis));
print();
}
cout<<endl;
}
return 0;
}