题目描述
传送门
题意:给出一个置换,判断其能否开方。
题解
一个置换平方了之后长度为奇数的循环节长度不变,长度为偶数的循环节变成长度相等的两个
所以判断平方之后的长度为偶数的循环节个数是否为偶数就行了
我也不知道为什么,找规律吧
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 30
int T,n,cnt[N];
char s[N];
bool flag[N],pd;
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%s",s);n=strlen(s);
memset(flag,0,sizeof(flag));
memset(cnt,0,sizeof(cnt));
for (int i=0;i<n;++i)
if (!flag[i])
{
int now=i;int len=0;
while (!flag[now])
{
++len;
flag[now]=1;
now=s[now]-'A';
}
++cnt[len];
}
pd=1;
for (int i=1;i<=n;++i)
{
if (i&1) continue;
if (cnt[i]&1) {pd=0;break;}
}
if (pd) puts("Yes");
else puts("No");
}
}