UVALive

来源:互联网 发布:cad网络培训 编辑:程序博客网 时间:2024/06/16 21:13

题意:

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


原创粉丝点击