题目:http://poj.org/problem?id=1026
另:http://acm.hdu.edu.cn/showproblem.php?pid=1439
题解:求出经过k次置换后,str[i]的位置。
代码:
#include <stdio.h>
#include <string.h>
int m,n,len,k;
char str[205],s[205];
int a[205],t[205]; //t记录i的循环长度
int v[205];
void solve() //求出循环长度
{
int x=0,k=1,j;
for(int i=1;i<=n;i++) { v[i]=0; t[i]=0; }
for(int i=1;i<=n;i++)
{
if(v[i]==0)
{
v[i]=k;
j=a[i];
x=1;
while(i!=j)
{
v[j]=k;
x++;
j=a[j];
}
}
t[k]=x;
k++;
}
}
int ok(int i) //返回字符串str的i处在新的字符串的位置
{
int m,j,x=0;
m=k%t[v[i]];
j=i;
while(x<m)
{
j=a[j];
x++;
}
return j;
}
int main()
{
// freopen("/home/wk/in.txt","r",stdin);
while(1)
{
scanf("%d",&n);
if(n==0)
break;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
solve();
while(1)
{
scanf("%d",&k);
if(k==0)
break;
getchar();
gets(str);
len=strlen(str);
// printf("%d\n",len);
if(len<n)
{
for(int i=len;i<n;i++)
str[i]=' ';
}
// for(int i=n-1;i>=0;i--)
// printf("%c",str[i]);
// printf("\n");
for(int i=1;i<=n;i++)
s[ok(i)-1]=str[i-1];
s[n]='\0';
printf("%s\n",s);
}
printf("\n");
}
}