萌新求助
查看原帖
萌新求助
677234
FstAutoMaton楼主2024/5/21 21:52

RT,一直wrong on #2 调不出来。

code:

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e6 + 5;

int w[kMaxN][26], st[kMaxN], fa[kMaxN], v[kMaxN], lx[28], rx[28], ans, vis, tot, n, m, t;
string s;

void Update(string s) {
  int p = 0;
  v[p]++;
  for (int i = 0; i < s.size(); i++) {
    int x = s[i] - 'a';
    !w[p][x] && (w[p][x] = ++tot, fa[tot] = p, st[tot] = x);
    p = w[p][x], v[p]++;
  }
}

void Dfs(int u, int x) {
  if (vis) {
    return;
  }
  for (int i = 1; i <= 26; i++) {
    lx[i] = lx[i - 1] + v[w[u][i - 1]] * bool(w[u][i - 1]);
  }
  for (int i = 26; i >= 1; i--) {
    rx[i] = rx[i + 1] + bool(v[w[u][i - 1]]) * bool(w[u][i - 1]);
  }
  int val = 0, sx = 0;
  for (int i = 0; i < 26; i++) {
    val += bool(v[w[u][i]]) * bool(w[u][i]);
    sx += v[w[u][i]] * bool(w[u][i]);
  }
  (x + val + v[u] - sx >= m) && (vis = 1, ans = u);
  for (int i = 0; i < 26; i++) {
    if (w[u][i]) {
      Dfs(w[u][i], lx[i] + rx[i + 2] + x + v[u] - sx);
    }
  }
}

void Solve() {
  cin >> n >> m;
  for (int i = 1; i <= n; i++) {
    cin >> s;
    Update(s);
  }
  s = "";
  Dfs(0, 0);
  for (int i = ans; i; i = fa[i]) {
    s = char(st[i] + 'a') + s;
  }
  if (ans == 0) {
    cout << "EMPTY";
  } else {
    cout << s << "\n";
  }
}

void Init() {
  fill(w[0], w[tot + 1], 0);
  fill(fa, fa + tot + 1, 0);
  fill(st, st + tot + 1, 0);
  fill(v, v + tot + 1, 0);
  tot = vis = ans = 0;
}

int main() {
  ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  for (cin >> t; t; t--) {
    Solve();
    Init();
  }
  return 0;
}
2024/5/21 21:52
加载中...