置换群第三题,找出循环节,然后取余进行操作,加深了对置换的应用,越发感觉置换群很有趣。
#include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int maxn =201; int n,k; char s[maxn],ss[maxn]; int zh[maxn],b[maxn],zz[maxn],f[maxn],ok[maxn]; int len; void pre() { int num,tmp; for(int i=0; i<n; i++) { int count=0; num=i; do { num=zh[num]; count++; } while(num!=i); ok[i]=count; } } void solve() { int num,res=1; for(int i=0; i<n; i++) { int tmp=i; int temp = (k-1)%ok[i]; for(int j=0; j<=temp; j++) { tmp=zh[tmp]; } ss[tmp]=s[i]; } } int main() { while(~scanf("%d",&n)&&n) { int bj=0; for(int i=0; i<n; i++) { int a; scanf("%d",&a); zh[i]=a-1; } memset(ok,-1,sizeof(ok)); while(~scanf("%d",&k)&&k) { memset(s,0,sizeof(s)); memset(ss,0,sizeof(ss)); getchar(); gets(s); len = strlen(s); if(len<n) { for(int i=len; i<n; i++) s[i]=' '; } if(!bj) pre(); bj=1; solve(); printf("%s\n",ss); } printf("\n"); } return 0; }
原文地址:http://blog.csdn.net/zh9406/article/details/45209061