?? cipher(置換群,找循環(huán)節(jié)).cpp
字號:
//可用置換群冪運算加速
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
int n,k;
int ex[210], last[210], seq[210];
char txt[210];
bool vis[210];
void find_circle()
{
int i,j;
int cir[210];
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++) {
if(!vis[i]) {
int tpos = i;
int len = 0;
do {
cir[len] = tpos;
vis[tpos] = true;
tpos = ex[ tpos ];
len ++;
} while(tpos != i);
for(j=0;j<len;j++) {
last[ cir[j] ] = cir[ (j+k)%len ];
seq[ cir[ (j+k)%len ] ] = cir[j];
}
}
}
}
int main()
{
int i;
while(scanf("%d", &n), n) {
for(i=0;i<n;i++) {
scanf("%d", ex+i);
ex[i] --;
}
while(scanf("%d", &k), k) {
getchar();
gets(txt);
int len = strlen(txt);
while(len < n) {
txt[len ++] = ' ';
}
txt[len] = 0;
find_circle();
for(i=0;i<n;i++) {
putchar(txt[ seq[i] ]);
}
printf("\n");
}
printf("\n");
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -