很挫的代码,凑合着
刚开始2B地求了最小公倍数,TLE了,其实不用,在每个循环里面各自搞定就好
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
#define N 240
#define ll long long
int a[N],b[N],c[N],vis[N],d[N],e[N];
int n,k;
ll mod;
char s[1000];
char obj[1000];
ll gcd(ll a,ll b)
{
return b==0 ? a : gcd(b,a%b);
}
ll lcm(ll a,ll b)
{
ll g=gcd(a,b);
return a/g*b;
}
int main ()
{
bool flag=false;
while(scanf("%d",&n)!=EOF)
{
if(flag)
puts("");
flag=true;
if(n==0) break;
for(int i=1;i<=n;++i)
scanf("%d",&a[i]),b[i]=a[i];
sort(b+1,b+1+n);
for(int i=1;i<=n;++i)
c[b[i]]=i;
while(scanf("%d",&k)!=EOF)
{
if(k==0) break;
char ch;
scanf("%c",&ch);
gets(s+1);
int len=strlen(s+1);
for(int i=len+1;i<=n;++i)
s[i]=' ';
memset(vis,0,sizeof(vis));
int cnt=0;
for(int i=1;i<=n;++i)
if(!vis[i])
{
cnt=0;
vis[i]=1;
int j=c[a[i]];
int tt=1;
d[cnt]=a[i];
e[cnt++]=i;
while(!vis[j])
{
tt++;
vis[j]=1;
d[cnt]=a[j];
e[cnt++]=j;
j=c[a[j]];
}
int re=k%tt;
for(j=1;j<=re;++j)
{
for(int z=0;z<cnt;++z)
obj[d[z]]=s[e[z]];
for(int z=0;z<cnt;++z)
s[d[z]]=obj[d[z]];
}
}
s[n+1]='\0';
printf("%s\n",s+1);
}
}
return 0;
}