CF1397A Juggling Letters

思路

题意:有 \(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();
} 
上一篇:Buried memory


下一篇:POJ2004 字符串处理+DFS