置换的应用。若一个置换B中所有的元素个数为偶数的循环节和它元素相等的循环节的个数为偶数个,就存在置换A使得A^2=B
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 const int maxn=30; 6 char s[maxn]; 7 int vis[maxn],cou[maxn]; 8 int main() 9 { 10 int n; 11 scanf("%d",&n); 12 while(n--) 13 { 14 memset(vis,0,sizeof(vis)); 15 memset(cou,0,sizeof(cou)); 16 scanf("%s",s); 17 int i,j; 18 for(i=0;i<26;i++) s[i]=s[i]-'A'; 19 int tc,tot=0; 20 for(i=0;i<26;i++) 21 { 22 if(!vis[i]) 23 { 24 vis[i]=1; 25 tc=1; 26 j=s[i]; 27 while(j!=i) 28 { 29 vis[j]=1; 30 j=s[j]; 31 tc++; 32 } 33 cou[tc]++; 34 } 35 } 36 for(i=2;i<=26;i+=2) 37 if(cou[i]%2) break; 38 if(i<=26)printf("No\n"); 39 else printf("Yes\n"); 40 } 41 return 0; 42 }