Link to the question: Ultraviolet A 12103-Leonardo's notebook
Given a replacement of 26 letters, ask if there is a replacement for a, so that A2 = B
Solution: break down a given replacement into several irrelevant cycles. When the length n of a loop is an odd number, it can be obtained by the product of two cycles whose length is N, it can also be split from two cycles with a length of 2n. If n is an even number, it can only be split from two cycles with a length of 2n, therefore, you can check whether there are an odd number with an even cycle length.
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 30;int main () { char s[maxn]; int cas, v[maxn], c[maxn]; scanf("%d", &cas); while (cas--) { memset(v, 0, sizeof(v)); memset(c, 0, sizeof(c)); scanf("%s", s); for (int i = 0; i < 26; i++) { if (v[i]) continue; int j = i, ret = 0; do { v[j] = 1; j = s[j] - ‘A‘; ret++; } while (i != j); c[ret]++; } bool flag = true; for (int i = 2; i < 26; i += 2) if (c[i]&1) flag = false; printf("%s\n", flag ? "Yes" : "No"); } return 0;}