답안 #716455

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
716455 2023-03-30T06:24:20 Z arush_agu 회문 (APIO14_palindrome) C++17
100 / 100
120 ms 104496 KB
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#ifdef DEBUG
#include <time.h>
#endif

#define all(a) (a).begin(), (a).end()
#define rev(a) (a).rbegin(), (a).rend()
#define F first
#define S second
int recur_depth = 0;
#ifdef DEBUG
#define dbg(x)                                                                 \
  {                                                                            \
    ++recur_depth;                                                             \
    auto x_ = x;                                                               \
    --recur_depth;                                                             \
    cerr << string(recur_depth, '\t') << "\e[91m" << __func__ << ":"           \
         << __LINE__ << "\t" << #x << " = " << x_ << "\e[39m" << endl;         \
  }
#else
#define dbg(x)
#endif

using namespace std;
using namespace __gnu_pbds;

typedef pair<int, int> ii;

typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> llll;

typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pair<int, int>> vii;
typedef vector<vii> vvii;

typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef vector<pair<ll, ll>> vll;
typedef vector<vll> vvll;

typedef vector<bool> vb;

template <class type1>
using ordered_set = tree<type1, null_type, less<type1>, rb_tree_tag,
                         tree_order_statistics_node_update>;

template <typename A, typename B>
ostream &operator<<(ostream &os, const pair<A, B> &p) {
  return os << '(' << p.first << ", " << p.second << ')';
}
template <typename T_container, typename T = typename enable_if<
                                    !is_same<T_container, string>::value,
                                    typename T_container::value_type>::type>
ostream &operator<<(ostream &os, const T_container &v) {
  os << '{';
  string sep;
  for (const T &x : v)
    os << sep << x, sep = ", ";
  return os << '}';
}

const ll MOD = 1e9 + 7;
// const ll MOD = 998244353;
const ll INF = 1e9;
const ld EPS = 1e-9;

const int MAXN = 3e5 + 10;

// Saw Solution

struct PalindromeTree {
  struct Node {
    ll label[26], suff, len, cnt_suff;
    vi eds;

    Node() {
      for (int i=0; i<26; i++) label[i] = -1;
    }
  } tree[MAXN + 100];
  string s;
  int curr_node, cnt_node;

  void init(string s_) {
    tree[0].len = -1;
    tree[0].suff = 0;

    tree[1].len = 0;
    tree[1].suff = 0;

    tree[0].eds.push_back(1);
    curr_node = cnt_node = 1;
    s = s_;

    for (int i=0; i<s.size(); i++) add(i);
  }

  void add(int idx) {
    int curr = curr_node;
    int c = s[idx] - 'a';

    while (1) {
      if (idx - tree[curr].len - 1 >= 0 && s[idx - tree[curr].len - 1] == s[idx]) break;
      curr = tree[curr].suff;
    }

    if (tree[curr].label[c] != -1) {
      curr_node = tree[curr].label[c];
      tree[curr_node].cnt_suff++;
      return;
    }

    curr_node = ++cnt_node;
    tree[curr].label[c] = curr_node;
    tree[curr_node].len = tree[curr].len + 2;
    tree[curr_node].cnt_suff = 1;

    if (curr == 0) {
      tree[curr_node].suff = 1;
      tree[1].eds.push_back(curr_node);
      return;
    }

    while (1) {
      curr = tree[curr].suff;
      if (idx - tree[curr].len - 1 >= 0 && s[idx - tree[curr].len - 1] == s[idx]) {
        tree[curr_node].suff = tree[curr].label[c];
        tree[tree[curr].label[c]].eds.push_back(curr_node);
        break;
      }
    }
  }

  ll get_score() {
    ll ans = -INF;
    function<void(int)> f = [&](int u) {
      for (int &v : tree[u].eds) {
        f(v);
        tree[u].cnt_suff += tree[v].cnt_suff;
      }
      ans = max(ans, tree[u].cnt_suff * tree[u].len);
    }; f(0);
    return ans;
  }
} pt;

void solve() {
  string s; cin >> s;
  pt.init(s);

  cout << pt.get_score() << "\n";
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(NULL);

  clock_t start = clock();

  int test_cases = 1;
  /* cin >> test_cases; */

  while (test_cases--)
    solve();

#ifdef DEBUG
  cerr << fixed << setprecision(10)
       << "\nTime Taken: " << (double)(clock() - start) / CLOCKS_PER_SEC
       << "s\n";
#endif
  return 0;
}

Compilation message

palindrome.cpp: In member function 'void PalindromeTree::init(std::string)':
palindrome.cpp:118:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |     for (int i=0; i<s.size(); i++) add(i);
      |                   ~^~~~~~~~~
palindrome.cpp: In function 'int main()':
palindrome.cpp:181:11: warning: unused variable 'start' [-Wunused-variable]
  181 |   clock_t start = clock();
      |           ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 75388 KB Output is correct
2 Correct 32 ms 75496 KB Output is correct
3 Correct 35 ms 75368 KB Output is correct
4 Correct 34 ms 75380 KB Output is correct
5 Correct 41 ms 75396 KB Output is correct
6 Correct 35 ms 75396 KB Output is correct
7 Correct 31 ms 75396 KB Output is correct
8 Correct 32 ms 75424 KB Output is correct
9 Correct 34 ms 75352 KB Output is correct
10 Correct 33 ms 75476 KB Output is correct
11 Correct 42 ms 75384 KB Output is correct
12 Correct 32 ms 75468 KB Output is correct
13 Correct 33 ms 75468 KB Output is correct
14 Correct 33 ms 75440 KB Output is correct
15 Correct 33 ms 75388 KB Output is correct
16 Correct 34 ms 75476 KB Output is correct
17 Correct 32 ms 75400 KB Output is correct
18 Correct 33 ms 75384 KB Output is correct
19 Correct 33 ms 75468 KB Output is correct
20 Correct 32 ms 75476 KB Output is correct
21 Correct 31 ms 75420 KB Output is correct
22 Correct 30 ms 75384 KB Output is correct
23 Correct 31 ms 75416 KB Output is correct
24 Correct 32 ms 75408 KB Output is correct
25 Correct 31 ms 75380 KB Output is correct
26 Correct 31 ms 75456 KB Output is correct
27 Correct 31 ms 75456 KB Output is correct
28 Correct 31 ms 75468 KB Output is correct
29 Correct 37 ms 75472 KB Output is correct
30 Correct 33 ms 75476 KB Output is correct
31 Correct 33 ms 75404 KB Output is correct
32 Correct 32 ms 75476 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 75520 KB Output is correct
2 Correct 31 ms 75448 KB Output is correct
3 Correct 32 ms 75472 KB Output is correct
4 Correct 34 ms 75400 KB Output is correct
5 Correct 40 ms 75476 KB Output is correct
6 Correct 32 ms 75476 KB Output is correct
7 Correct 32 ms 75460 KB Output is correct
8 Correct 35 ms 75532 KB Output is correct
9 Correct 32 ms 75464 KB Output is correct
10 Correct 37 ms 75468 KB Output is correct
11 Correct 41 ms 75420 KB Output is correct
12 Correct 38 ms 75436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 76124 KB Output is correct
2 Correct 34 ms 76032 KB Output is correct
3 Correct 34 ms 76408 KB Output is correct
4 Correct 33 ms 76356 KB Output is correct
5 Correct 34 ms 75652 KB Output is correct
6 Correct 33 ms 75760 KB Output is correct
7 Correct 36 ms 75852 KB Output is correct
8 Correct 33 ms 75468 KB Output is correct
9 Correct 35 ms 75500 KB Output is correct
10 Correct 31 ms 75484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 82020 KB Output is correct
2 Correct 53 ms 80668 KB Output is correct
3 Correct 58 ms 85256 KB Output is correct
4 Correct 64 ms 83040 KB Output is correct
5 Correct 67 ms 76908 KB Output is correct
6 Correct 55 ms 77956 KB Output is correct
7 Correct 58 ms 79180 KB Output is correct
8 Correct 43 ms 75852 KB Output is correct
9 Correct 57 ms 77952 KB Output is correct
10 Correct 67 ms 76788 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 120 ms 95132 KB Output is correct
2 Correct 115 ms 88388 KB Output is correct
3 Correct 111 ms 104496 KB Output is correct
4 Correct 106 ms 92648 KB Output is correct
5 Correct 100 ms 81072 KB Output is correct
6 Correct 76 ms 87604 KB Output is correct
7 Correct 68 ms 85388 KB Output is correct
8 Correct 39 ms 76772 KB Output is correct
9 Correct 46 ms 76704 KB Output is correct
10 Correct 92 ms 80116 KB Output is correct
11 Correct 107 ms 88804 KB Output is correct
12 Correct 38 ms 78892 KB Output is correct