http://acm.hdu.edu.cn/showproblem.php?pid=2371
题意:给出一个长度为n的字符串(标号为1~n),以及n个数代表字符串的变换规则,问该字符串是由哪个字符串按照变换规则变换m次得到的?如n=5,m=3,变换规则 2 3 1 5 4 (生成的下一个字符串即按照此标号的顺序对应的串), “hello" -> "elhol" -> "lhelo" -> "helol", 故helol 是由"hello''变换3次得到的。
思路:此类型的题目一般是找循环节,但是此题不能找字符串的循环节,因为数据范围太大,找字符串的循环节会超时。由于只有80个字符,所以可以找每个字符的循环节,并在查找过程中记录下来该字符在变换t次后所在的位置,这样就能通过m对循环节取余,找到该字符在目标串中的位置。

1 #include <stdio.h> 2 #include <string.h> 3 const int N=82; 4 int pos[N][N],p[N]; 5 char str[N],s[N]; 6 int main() 7 { 8 int n,m; 9 while(~scanf("%d%d",&n,&m)) 10 { 11 if (n==0&&m==0) 12 break; 13 for (int i = 0; i < n; i++) 14 { 15 scanf("%d%*c",&p[i]); 16 p[i]--; 17 } 18 gets(s); 19 for (int i = 0; i < n; i++) 20 { 21 int j = p[i]; 22 int cnt = 0; 23 pos[i][cnt++] = i; 24 while(j!=i)//找第i个字符的循环节 25 { 26 pos[i][cnt++] = j;//表示第i个字符在变换cnt次后所在的位置 27 j = p[j]; 28 } 29 int t = m%cnt;//第i个字符变换的次数 30 str[pos[i][t]] = s[i];//将该字符存入其在目标串中的位置上 31 } 32 str[n] = '