先找到循环节,再用m对循环节的长度取模即可.
#include<iostream>
#include<math.h>
#include<cstdio>
#include<stdlib.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=205;
int a[N],b[N][N],v[N],num[N]= {0};
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
memset(num,0,sizeof(num));
memset(v,0,sizeof(v));
for(int i=1; i<=n; i++)
scanf("%d",&a[i]);
int cnt=0;
for(int i=1; i<=n; i++)
{
if(v[i]==0)
{
int j=0;
v[i]=1;
cnt++;
b[cnt][num[cnt]++]=i;
int k=i;
while(1)
{
for(j=1; j<=n; j++)
{
if(v[j]==1)continue;
if(a[k]==j)break;
}
if(j>n)break;
k=j;
v[j]=1;
b[cnt][num[cnt]++]=j;
}
}
}
int k;
while(~scanf("%d",&k)&&k)
{
char s[N],ans[N];
gets(s);
int len =strlen(s);
for(int i=len;i<=n;i++)
s[i]=' ';
for(int i=1;i<=cnt;i++)
for(int j=0;j<num[i];j++)
{
ans[b[i][(j+k)%num[i]]]=s[b[i][j]];
}
ans[n+1]='\0';
printf("%s\n",ans+1);
}
printf("\n");
}
return 0;
}