题意:给你一个置换和一个字符串 按照置换m次之后的结果 求原字符串
思路:构造一个矩阵1的每一行只有1个1 a[i][j]代表第i个字母替换成了第j个字母 然后快速幂
#include <cstdio>
#include <cstring>
const int maxn = 88;
struct Mat
{
int a[maxn][maxn];
};
Mat A, B;
int n, m;
Mat get(Mat x, Mat y)
{
Mat z;
memset(z.a, 0, sizeof(z.a));
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
for(int k = 1; k <= n; k++)
{
z.a[i][j] += x.a[i][k]*y.a[k][j];
//z.a[i][j] %= 2;
}
return z;
}
void Mat_pow(int x)
{
//puts("s");
if(x <= 0)
return;
while(x)
{
if(x&1)
B = get(B, A);
A = get(A, A);
x >>= 1;
}
}
int main()
{
while(scanf("%d %d", &n, &m) && (n+m))
{
memset(A.a, 0, sizeof(A.a));
memset(B.a, 0, sizeof(B.a));
for(int i = 1; i <= n; i++)
{
int x;
scanf("%d", &x);
A.a[x][i] = 1;
B.a[i][i] = 1;
}
Mat_pow(m);
char str[1000];
getchar();
gets(str+1);
//puts(str+1);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(B.a[i][j] == 1)
{
printf("%c", str[j]);
break;
}
}
}
puts("");
}
return 0;
}
HDU 2371 Decode the Strings 矩阵快速幂求m次置换,布布扣,bubuko.com
HDU 2371 Decode the Strings 矩阵快速幂求m次置换
原文:http://blog.csdn.net/u011686226/article/details/22917103