题意 :
给定一个置换,求字符串n次置换的结果。
分析 :
1. 求出每个字母的转换周期。
2. 对每个字母,多少次变换先把周期MOD掉,剪少计算量。
3. block 与 block 之间打一个空行,PE一次
代码 :
#include <iostream> using namespace std; int change[201]; int cycle[201]; char str[205]; char str1[205]; int times; void changeto(int t); int main() { int changenum; while(cin>>changenum,changenum) { int nowchangenum; for(nowchangenum=1;nowchangenum<=changenum;++nowchangenum) { cin>>change[nowchangenum]; } for(int i=1;i<=changenum;++i) { int cnt=0; int pos=i; do { ++cnt; pos=change[pos]; }while(pos!=i); cycle[i]=cnt; } while(cin>>times,times) { getchar(); str[0]='0'; scanf("%[^'/n']",&str[1]); int len=strlen(str); for(int i=len;i<=changenum;++i) { str[i]=' '; } str[changenum+1]='/0'; int t=1; char ch; ch=str[1]; strcpy(str1,str); for(int i=1;i<=changenum;++i) { changeto(i); } printf("%s/n",&str1[1]); } cout<<endl; } } void changeto(int t) { int t_st=t; int modvalue=times%cycle[t]; for(int i=1;i<=modvalue;++i) { t=change[t]; } //知道要变换到几, str1[t]=str[t_st]; } //保留那个字符