pku3128Leonardo's Notebook(置换群的幂运算) ???

http://acm.pku.edu.cn/JudgeOnline/problem?id=3128

题意:给出一个置换a,证明它是否是另一个置换b的平方。

此题也要用到潘震皓的《置换群快速幂运算 研究与探讨》这篇文章。也是懵懵懂懂的~~~哎…加油吧!!!

#include<iostream> using namespace std; const int MAX = 27; char str[MAX]; int data[MAX], ans[MAX], visit[MAX]; int fun(int n) { int i,j,count; for(i=0; i<n; i++) //求置换的周期,并在此位置上++; { if(visit[i]) //如果没有被访问过 { j = data[i]; count = 1; visit[i] = 0; while(i != j) { visit[j] = 0; count++; j = data[j]; } //ans[i] = conut; //求循环周期 ans[count]++; //在此周期的位置上加一, } } for(i=2; i<n; i+=2) //这里要是i++就会WA;偶数位 { if(ans[i]) //存在置换周期 { if(ans[i] % 2 == 1) //如果是奇数就表明不成立。退出 return 0; } } return 1; } int main() { int t,i,len; scanf("%d",&t); while(t--) { scanf("%s",str); len = strlen(str); for(i=0; i<len; i++) data[i] = str[i] - 'A'; memset(visit,1,sizeof(visit)); memset(ans,0,sizeof(ans)); if(fun(len)) printf("Yes/n"); else printf("No/n"); } return 0; } 

你可能感兴趣的:(fun)