Submission #197988

#TimeUsernameProblemLanguageResultExecution timeMemory
197988model_codeLampice (COCI19_lampice)C++17
73 / 110
5052 ms6008 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 50010;

int n;
char input[MAXN];
vector<int> adj[MAXN];

int stk_sz = 1;
char stk[2 * MAXN];
int pivot = 0;
int ans = 1;

int manacher() {
  static int rad[2 * MAXN];

  int x = 0;
  for (int i = 1; i < stk_sz; ++i) {
    int &r = rad[i] = 0;
    if (i <= x + rad[x])
      r = min(rad[2 * x - i], x + rad[x] - i);
    while (i - r - 1 >= 0 && i + r + 1 < stk_sz &&
        stk[i - r - 1] == stk[i + r + 1]) ++r;
    if (i + r >= x + rad[x]) x = i;
  }

  int ret = 0;
  for (int i = 0; i < stk_sz; ++i)
    if (rad[i] > ret)
      ret = rad[i];
  return ret;
}

void dfs(int x, int prev = -1) {
  stk[stk_sz++] = input[x];
  stk[stk_sz++] = '*';
  if (adj[x].size() == 1 && x < pivot)
    ans = max(ans, manacher());
  for (int y : adj[x]) {
    if (y == prev) continue;
    dfs(y, x);
  }
  stk_sz -= 2;
}

int main(void) {
  ios_base::sync_with_stdio(false);
  cin >> n;
  cin >> input;
  for (int i = 0; i < n - 1; ++i) {
    int u, v;
    cin >> u >> v;
    u--; v--;
    adj[u].push_back(v);
    adj[v].push_back(u);
  }
  stk[0] = '*';
  for (int i = 0; i < n; ++i) {
    if (adj[i].size() != 1)
      continue;
    pivot = i;
    dfs(i);
  }
  cout << ans << endl;
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...