思路
题意:有 \(n\) 个字符串 \(s_1,s_2,...,s_n\),你可以进行任意次操作,每次操作可以将 \(s_i\) 中的任何一个字符删除,并将这个字符插入到 \(s_j\) 的某一个位置上(\(l\le i, j\le n\) 且 \(i\) 可以等于 \(j\)),问经过任意次操作后能不能得到 \(n\) 个相同的字符串
题意很明确,其实我们就是要判断每个字符的出现次数是不是 \(n\) 的倍数,如果某个字符的出现次数 \(cnt\) 是 \(n\) 的倍数,那么显然可以在每个字符串的相同位置中中令这个字符出现 \(\frac{cnt}{n}\) 次,否则就不能得到 \(n\) 个相同的字符串,因此直接记录每一位的出现次数,判断是不是 \(n\) 的倍数即可。
代码
#include <bits/stdc++.h>
using namespace std;
const int A = 1e5 + 11;
const int B = 1e6 + 11;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
inline int read() {
char c = getchar();
int x = 0, f = 1;
for ( ; !isdigit(c); c = getchar()) if (c == '-') f = -1;
for ( ; isdigit(c); c = getchar()) x = x * 10 + (c ^ 48);
return x * f;
}
int a[A];
char s[A];
inline void solve() {
int n = read();
memset(a, 0, sizeof(a));
for (int i = 1; i <= n; i++) {
scanf("%s", s + 1);
int len = strlen(s + 1);
for (int i = 1; i <= len; i++) {
a[s[i] - 'a' + 1]++;
}
}
for (int i = 1; i <= 26; i++) {
if (a[i] % n) {
puts("NO");
return;
}
}
puts("YES");
}
int main() {
int T = read();
while (T--) solve();
}