Submission #1106964

#TimeUsernameProblemLanguageResultExecution timeMemory
1106964PersiaLampice (COCI19_lampice)C++14
17 / 110
5078 ms281796 KiB
/*
    Author: Persia
    Touhou
*/
#include <algorithm>
#include <bits/stdc++.h>
#include <vector>
#define rep(i, l, r) for(int i = l; i <= r; i++)
#define rep2(i, l, r) for(int i = l; i >= r; i--)
#define fi first
#define se second
#define bit(i, x) (x >> i & 1)
#define SZ(x) (int)(x).size()
#define MASK(x) (1 << x)

using namespace std;
const int N = 5e4 + 3;
const int mod = 1e9 + 7;

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
long long rnd(long long l, long long r) {
  return uniform_int_distribution<long long>(l, r)(rng);
}
int n, a[N];
vector<int> G[N];
int sz[N], dd[N];
int pw[2 * N];
int k;
int mx;
map<int, int> mp[N];
int PW(int x, int y) {
  int val = 1;
  while(y) {
    if(y & 1) val = (1LL * val * x) % mod;
    x = (1LL * x * x) % mod;
    y >>= 1;
  }
  return val;
}
void PreDFS(int u, int par) {
  sz[u] = 1;
  for(auto v : G[u]) if(v != par && !dd[v]) {
    PreDFS(v, u);
    sz[u] += sz[v];
  }
}
int FindCentroid(int u, int par, int nn) {
  for(auto v : G[u]) if(v != par && !dd[v]) {
    if(sz[v] > nn / 2) return FindCentroid(v, u, nn);
  }
  return u;
}
bool DFS(int u, int par, int h, int g, int d, bool flag) {
  if(d > k) return 0;
  mx = max(mx, d);
  h = (1LL * h * 31 + a[u]) % mod;
  g = (g + 1LL * a[u] * pw[d + n]) % mod;
  int val = (((h - 1LL * g * pw[k - d + n])) % mod + mod) % mod;
  if(flag == 0)  {
    if(mp[k - d][val]) return 1;
  }
  else {
    mp[d][val] = 1;
  }
  for(auto v : G[u]) if(v != par && !dd[v]) {
    if(DFS(v, u, h, g, d + 1, flag)) return 1;
  }
  return 0;
}
vector<int> del;
bool Centroid(int u) {
  PreDFS(u, -1);
  u = FindCentroid(u, -1, sz[u]);
  dd[u] = 1;
  del.push_back(u);
//  cout << u << " ";
  long long h = 0;
  long long g = a[u];
  int val = (((h - 1LL * g * pw[k - 0 + n])) % mod + mod) % mod;
  mp[0][val] = 1;
  for(auto v : G[u]) if(!dd[v]) {
    if(DFS(v, u, h, g, 1, 0)) return 1;
    DFS(v, u, h, g, 1, 1);
  }
  rep(i, 0, mx) mp[i].clear();
  mx = 0;
//  cout << u << " ";
  for(auto v : G[u]) if(!dd[v]) {
    if(Centroid(v)) return 1;
  }
  return 0;
}
int main(int argc, char* argv[]) {
  ios_base::sync_with_stdio(0);
  cin.tie(0); cout.tie(0);
  if(fopen("testing.txt", "r")) {
    freopen("testing.txt", "r", stdin);
    freopen("outputing.txt", "w", stdout);
  }

  cin >> n;
  pw[0 + n] = 1;
  // 0 -> n
  // n -> n + n
  // -n -> -1
  //0 - n - 1
  rep(i, 1, n) pw[i + n] = PW(31, i);
  rep(i, 0, n - 1) pw[i] = PW(pw[i + n], mod - 2);
//  rep(i, 0, n - 1) cout << (1LL * pw[i + n] * pw[i]) % mod << " ";
  rep(i, 1, n) {
    char x; cin >> x;
    a[i] = x - 'a' + 1;
  }
  rep(i, 1, n - 1) {
    int x, y; cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }

//  k = 1;
//  cout << Centroid(1);


  int l = 1, r = n / 2, res = 1;
  while(l <= r) {
    int mid = (l + r) / 2;
    k = 2 * mid - 1;
//    cout << k + 1 << " ";
    if(Centroid(1)) l = mid + 1, res = 2 * mid;
    else r = mid - 1;
    rep(i, 0, mx) {
      mp[i].clear();
    }
    for(auto i : del) dd[i] = 0;
    del.clear();
    mx = 0;
  }
  l = 0, r = (n - 1) / 2;
  while(l <= r) {
    int mid = (l + r) / 2;
    k = 2 * mid + 1 - 1;

    if(Centroid(1)) l = mid + 1, res = max(res, 2 * mid + 1);
    else r = mid - 1;
    for(auto i : del) dd[i] = 0;
    rep(i, 0, mx) {
      mp[i].clear();
    }
    del.clear();
    mx = 0;
  }
  cout << res;
}

Compilation message (stderr)

lampice.cpp: In function 'int main(int, char**)':
lampice.cpp:97:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |     freopen("testing.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
lampice.cpp:98:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |     freopen("outputing.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...