置换群的问题
先求去各个置换群及其长度, 然后看取模后的置换就好了,
长度为len的置换群置换len次相当于没置换
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>
using namespace std;
#define MAXN 220
int vis[MAXN];
int len[MAXN], cnt = 0;
int change[MAXN][MAXN];
int key[MAXN];
char str[MAXN];
char ans[MAXN];
//求循环节及其长度
void getcir( int n )
{
cnt = 0;
memset(vis, 0, sizeof(vis));
for( int i = 1; i <= n; i++)
{
if(!vis[i])
{
int tem = i;
len[cnt] = 0;
while(!vis[tem])
{
change[cnt][len[cnt]++] = tem;
vis[tem] = true;
tem = key[tem];
}
cnt++;
}
}
}
void solve( )
{
int n, m;
while(scanf("%d",&n) != EOF && n)
{
for( int i = 1; i <= n; i++)
scanf("%d",&key[i]);
getcir( n );
while(scanf("%d",&m)&& m)
{
//除第一个空格
gets(str);
int l = strlen(str);
//补齐空格
for( int i = l ; i <= n; i++) str[i] = ' ';
str[n+1] = '\0';
for( int i = 0; i < cnt; i++)
for( int j = 0; j < len[i]; j++)
ans[change[i][(j+m)%len[i]]] = str[change[i][j]];
ans[n+1]= '\0';
printf("%s\n",ans+1);
}
printf("\n");
}
}
int main()
{
solve();
return 0;
}