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