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;
}

 

posted @ 2013-05-26 22:19  心向往之  阅读(135)  评论(0编辑  收藏  举报