题意:
给出26个大写字母到置换B,问是否存在一个置换A,使得 A^2 == B
题解:
刘汝佳白书148页结论知:
一个长度为n的循环置换,(1)当n为奇数的时候,可以由两个相同的2×n长到循环节分裂得到,或者两个相同的长度为 n 的循环节相乘得到
(2)当n为偶数的时候,只能由两个相同的2×n长到循环节分裂得到
故:
把置换B分解成若干个循环节到时候
只需要求解长度为偶数的循环节的个数是否为偶数,若是则输出yes,否则no
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int T;
char str[100];
int vis[100],num[100];
//freopen("in.txt","r",stdin);
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(num,0,sizeof(num));
scanf("%s",str);
for(int i=0;i<26;i++){
if(!vis[i]){
int cnt=0,p=i;
while(!vis[p]){
cnt++;
vis[p]=1;
p=str[p]-'A';
}
num[cnt]++;
}
}
int ok=1;
for(int i=0;i<26;i+=2)
if(num[i]%2==1) ok=0;
if(ok) puts("Yes");
else puts("No");
}
return 0;
}