UVA 306 Cipher

UVA_306

    一开始倒是想到了这种移位加密是有周期的,但最后却是用的它们的最小公周期去算的。

    后来发现比别人的程序要慢很多,仔细看后才发现实际可以对每个字符的位置都用它自己的周期算一下,得到的位置也就是该字符最终的位置,这样相比用最小公周期去算要节省很多时间。

#include<stdio.h>
#include<string.h>
#define MAXD 210
char b[310], txt[MAXD], code[MAXD];
int g[MAXD], N, p[MAXD], t[MAXD], K;
void init()
{
int i, j, k, n;
for(i = 1; i <= N; i ++)
scanf("%d", &g[i]);
for(i = 1; i <= N; i ++)
{
k = g[i];
for(n = 1; k != i; n ++, k = g[k]);
t[i] = n;
}
}
void solve()
{
int i, j, k;
memset(txt, ' ', sizeof(txt));
for(i = 1; b[i]; i ++)
txt[i] = b[i];
for(i = 1; i <= N; i ++)
p[i] = i;
for(i = 1; i <= N; i ++)
{
k = K % t[i];
for(j = 0; j < k; j ++)
p[i] = g[p[i]];
}
for(i = 1; i <= N; i ++)
code[p[i]] = txt[i];
for(i = 1; i <= N; i ++)
printf("%c", code[i]);
printf("\n");
}
int main()
{
for(;;)
{
scanf("%d", &N);
if(!N)
break;
init();
for(;;)
{
scanf("%d", &K);
if(!K)
break;
getchar();
gets(b + 1);
solve();
}
printf("\n");
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2294931.html