T^K 很好求,每个环转K次即可。(置换群的次幂是个简单的问题,难的是开方)。
这题就是一个简单的置换幂;
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define pb push_back
using namespace std;
typedef long long ll;
const int M = 1e5+7;
char s[2200],t[220];
int a[M],b[M];int vs[M];
vector<int>v;
int main()
{
int n,k;
while(scanf("%d",&n))
{
if(n==0)break;
for(int i=1;i<=n;i++)
scanf("%d",&k),a[k]=i;
while(cin>>k)
{
if(k==0)break;
getchar();
gets(s);
// cout<<s<<"===-= "<<endl;
int l=strlen(s);
for(int i=1;i<=l;i++)t[i]=s[i-1];
for(int i=l+1;i<=n;i++)t[i]=' ';
memset(vs,0,sizeof(vs));
for(int i=1;i<=n;i++)
{
if(vs[i])continue;
int tp=i;v.clear();
while(!vs[tp])
{
v.pb(tp);
vs[tp]=1;
tp=a[tp];
}
int nw=v.size();
for(int j=0;j<nw;j++)b[j]=(j+k)%nw;
for(int j=0;j<nw;j++)s[v[j]]=t[v[b[j]]];
}
for(int i=1;i<=n;i++)printf("%c",s[i]);
puts("");
}
puts("");
}
return 0;
}