poj 3128 置换群
题意:问一个置换f,能不能表示成两个置换g的平方?
分析:奇置换的平方为一个等长奇置换
偶置换的平方为两个原置换一半长度的置换
所以如果有两个相同长度的偶置换,则可以由另一个2倍长度的偶置换平方得到,求出不同长度的偶置换的个数,若都为偶数个,则f可以表示成g*g,否则不可以。
int n; char s[27]; int b[27],c[14]; int main(){ scanf("%d",&n); while(n--){ scanf("%s",s); memset(b,0,sizeof b); memset(c,0,sizeof c); FOR(i,0,26){ if(b[i])continue; b[i]=1; int cnt=1; for(int j=s[i]-'A';j!=i;j=s[j]-'A'){b[j]=1;cnt++;} if(cnt%2==0)c[cnt/2]^=1; } bool f=true; FOR(i,1,14) if(c[i]) {f=false; break;} if(f) printf("Yes\n"); else printf("No\n"); } return 0; }