fork(1) download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define MAX 100
  4. int n,P[MAX];
  5. string str;
  6. void mult(bool A[MAX][MAX],bool B[MAX][MAX]){
  7.  
  8. bool res[MAX][MAX];
  9.  
  10. for(int i=0;i<n;i++)
  11. for(int j=0;j<n;j++){
  12. res[i][j] = 0;
  13. for(int k=0;k<n;k++)
  14. res[i][j] = (res[i][j]|(A[i][k]&B[k][j]));
  15. }
  16.  
  17. for(int i=0;i<n;i++)
  18. for(int j=0;j<n;j++)
  19. A[i][j] = res[i][j];
  20. }
  21.  
  22.  
  23. void init(bool A[MAX][MAX],bool res[MAX][MAX]){
  24.  
  25. // for(int i=0;i<n;i++)
  26. // for(int j=0;j<n;j++)
  27. // res[i][j] = A[i][j] = 0;
  28. memset(res,0,sizeof(res));
  29. memset(A,0,sizeof(A));
  30. for(int i=0;i<n;i++)
  31. A[P[i]][i] = 1,res[i][i] = 1;
  32.  
  33. }
  34.  
  35.  
  36. void power(int b){
  37.  
  38. bool A[MAX][MAX],res[MAX][MAX];
  39.  
  40. init(A,res);
  41.  
  42. while(b){
  43. if(b&1)
  44. mult(res,A);
  45. b/=2;
  46. mult(A,A);
  47. }
  48.  
  49.  
  50. for(int i=0;i<n;i++)
  51. for(int j=0;j<n;j++)
  52. if(res[i][j])
  53. cout << str[j];
  54. cout << endl;
  55. }
  56.  
  57.  
  58. int main(){
  59.  
  60. while(1){
  61. int m;
  62. scanf("%d%d",&n,&m);
  63. if(n==0 && m==0)
  64. break;
  65. for(int i=0;i<n;i++){
  66. scanf("%d",&P[i]);
  67. --P[i];
  68. }
  69. getchar();
  70. getline(cin,str);
  71. power(m);
  72. str.clear();
  73. }
  74. return 0;
  75. }
Success #stdin #stdout 0s 3436KB
stdin
5 3
2 3 1 5 4
helol
16 804289384
13 10 2 7 8 1 16 12 15 6 5 14 3 4 11 9
scssoet tcaede n
8 12
5 3 4 2 1 8 6 7
encoded?
0 0
stdout
hello
ssccedsscsot taee nsot taee ncedsot taee nsot taee nsot taee nsscsot taee nsot taee ncedsot taee nsot taee nsot taee n
encoded?encoded?encoded?encoded?encoded?encoded?encoded?encoded?