LA3641置换群(A^2=B)

/*LA3641
置换群:
对于置换B,问是否存在A^2=B?
已经有存在的规律,总结如下:
对于循环单元群B(这里之不能再细分)
1、若元素个数为奇数,则一定存在A
2、若元素个数为偶数,则两个不想交的群B1,B2,
一定存在A^2=B1B2(这道题只要求判断是否存在,没有要求个数);
3、对于循环群B=(B1)(B2)(B3)...(Bn)分解成单元群,
存在A的“充分必要”是偶数元素个数的循环群个数是偶数
*/
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>

using namespace std;

int t;
int nums[30],vis[30];
char B[30];
int main(){
    cin>>t;
    while(t--){
        scanf("%s",B);
        memset(vis,0,sizeof(vis));
        memset(nums,0,sizeof(nums));
        for(int i=0;i<26;i++){//与书上思路不同,以B的顺序扫描
            int k=B[i]-'A';
            if (!vis[k]){
                int cnt=0;
                while (!vis[k]) {
                    vis[k]=1;
                    k=B[k]-'A';
                    cnt++;
                }
                nums[cnt]++;
            }
        }
        bool ans=true;
        for(int i=2;i<=26;i+=2)
            if (nums[i]%2!=0) ans=!ans;
        if(ans) cout<<"Yes
"<<endl;else cout<<"No"<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/little-w/p/3570272.html