【描述问题】
一个len长字符串移动位置k次。
移动位置给出 n1,n2...一直len个。
n2代表如果字符位于第二个位置,如果移动位置到下一个,就是n2位置。
【思想】
因为位置转移构成若干环,利用环可以很快得到移位k次的字符串。
【代码】
/** Code For Keenbo @ 2012*/
#include<stdio.h>
#include<string.h>
/* Pre Define*/
#define size 202
/* method run */
int Run()
{
char * data=new char[size];
char * outdata=new char[size];
int positions[size],maping[size];
int ismap[size]={0},maplen[size]={0};
int len,k;
int index,mlindex=-1,mpindex=-1;
/* get Input*/
scanf("%d",&len);
for(index=0;index<len;index++)
{
scanf("%d",&positions[index]);
positions[index]--;
}
scanf("%d",&k);
while(k)
{
getchar();
gets(data);
index=0;
while(data[index]!='\0')
{
index++;
}
for(;index<=len;index++)
{
data[index]=' ';
}
data[index]='\0';
/* create map */
for(index=0;index<len;++index)
{
int i=index;
int count=0;
while(!ismap[i])
{
count++;
ismap[i]=1;
mpindex++;
maping[mpindex]=i;
i=positions[i];
if(i==index)
{
mlindex++;
maplen[mlindex]=count;
break;
}
}
}
/* decode*/
int beg,end;
mlindex=0;
beg=0;
end=beg+maplen[mlindex]-1;
while(beg<len-1)
{
int i=beg;
while(i<=end)
{
int fp=beg+((i-beg+(k%maplen[mlindex]))%maplen[mlindex]);
outdata[maping[fp]]=data[maping[i]];
i++;
}
beg=end+1;
mlindex++;
end=beg+maplen[mlindex]-1;
}
/*Output*/
for(index=0;index<len;index++)
printf("%c",outdata[index]);
printf("\n");
scanf("%d",&k);
}
return 0;
}