Submission #395114

#TimeUsernameProblemLanguageResultExecution timeMemory
395114ollelPalindromes (APIO14_palindrome)C++14
0 / 100
89 ms114780 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <string>
using namespace std;
typedef vector<int> vi;
typedef vector<vector<int>> vii;
#define rep(i, a, b) for(int i = a; i < b; i++)

struct node {
  int n = 1, size = 0, suffix_link, next_link[26] = {};
};

class eertree {
public:
  const int MAXN = 1000000;
  int n;
  vector<node> nodes;
  int last = 3;

  eertree(string s) {
    n = s.size();
    nodes.resize(MAXN);
    nodes[1].size = -1; nodes[1].suffix_link = 1;
    nodes[2].size = 0; nodes[2].suffix_link = 1;
    int cur, cursize, suff = 1, let;
    rep(pos, 0, n) {
      cur = suff; let = s[pos]-'a';

      while (true) {
        cursize = nodes[cur].size;
        // cout << "FIND "<< cur << " " << pos - cursize - 1 << " " << pos << endl;
        if (pos - cursize - 1 >= 0 && s[pos - cursize - 1] == s[pos]) break;
        cur = nodes[cur].suffix_link;
      }
      // cout << "pos: "<<pos<<endl;

      if (nodes[cur].next_link[let]) {
        // cout << "exists\n" << cur << " to " << let << endl;
        cur = nodes[cur].next_link[let];
        nodes[cur].n++;
        suff = cur;
        // while (cur > 2) {
        //   cout <<cur << " HEHEHE\n" ;
        //   nodes[cur].n++;
        //   cur = nodes[cur].suffix_link;
        // }
      }
      else
      {
        nodes[cur].next_link[let] = last;
        nodes[last].size = nodes[cur].size + 2;
        while (true) {
          // cout << cur << " " << pos - cursize - 1 << " " << pos << endl;
          cursize = nodes[cur].size;
          cur = nodes[cur].suffix_link;
          if (pos - cursize - 1 >= 0 && s[pos - cursize - 1] == s[pos]) {
            nodes[last].suffix_link = max(2, cur);
            // while (cur > 2) {
            //   cout <<cur << " HEHEHE\n" ;
            //   nodes[cur].n++;
            //   cur = nodes[cur].suffix_link;
            // }

            break;
          }
        }
        suff = last;
        last++;
      }
      // cout << last << "!" << endl;
    }
  }
};


int main(){
  string p;
  cin >> p;
  eertree e(p);
  int best = 0;
  for (auto &node : e.nodes) {
    best = max(best, node.n * node.size);
  }
  cout << best << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...