Submission #941994

# Submission time Handle Problem Language Result Execution time Memory
941994 2024-03-10T01:06:48 Z JoseSoto Palindromes (APIO14_palindrome) C++14
100 / 100
37 ms 62804 KB
#include <bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define all(v) v.begin(), v.end()
#define sz(x) ((int) (x).size())
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
using vi = vector<int>;
using vp = vector<pii>;
using vl = vector<ll>;
using vvi = vector<vi>;
using vvl = vector<vl>;
using vb = vector<bool>;

template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p){return os << '(' << p.fi << ", " << p.se << ')';}
template<typename C, typename T = typename enable_if<!is_same<C, string>::value, typename C::value_type>::type>
ostream& operator<<(ostream &os, const C &v){string sep; for(const T &x : v) os << sep << x, sep = " "; return os;}
#define deb(...) logger(#__VA_ARGS__, __VA_ARGS__)
template<typename ...Args>
void logger(string vars, Args&&... values){
    cout << "[Debug]\n\t" << vars << " = ";
    string d = "[";
    (..., (cout << d << values, d = "] ["));
    cout << "]\n";
}

constexpr short alpha = 26;
constexpr char offset = 'a';

struct state{
    int l, link, cnt;
    array<int,alpha> go;
    state(){
        l = cnt = 0;
        go.fill(0);
    }
};

struct eertree{
    int n = 2;
    int last = 1;
    vector<state> et;
    string s;

    eertree(){
        et.resize(2);
        et[0].link = et[1].link = 1;
        et[1].l = -1;
    }

    int palSuff(int x){
        while(s[sz(s) - 2 - et[x].l] != s.back()) x = et[x].link;
        return x;
    }

    int add(char ch){
        s.pb(ch);
        last = palSuff(last);
        bool new_pal = !et[last].go[ch-offset];
        if(new_pal){
            et.pb(state());
            et[last].go[ch-offset] = n++;
            et.back().link = et[palSuff(et[last].link)].go[ch-offset];
            et.back().l = et[last].l + 2;
            if(et.back().l == 1) et.back().link = 0;
        }
        last = et[last].go[ch-offset];
        // Do something with last, maybe if new_pal
        et[last].cnt++;
        if(et[last].l == sz(s)) last = et[last].link;
        return new_pal;
    }

    void computeFrequency(){
        for(int i=n-1; i>1; i--)
            et[ et[i].link ].cnt += et[i].cnt;
    }
};

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

    string s;
    cin >> s;
    eertree et;
    for(auto ch: s) et.add(ch);
    et.computeFrequency();
    ll ans = 0;
    for(int i=2; i<et.n; i++) ans = max(ans, 1LL*et.et[i].l*et.et[i].cnt);
    cout << ans << "\n";
    return 0;
}

Compilation message

palindrome.cpp: In function 'void logger(std::string, Args&& ...)':
palindrome.cpp:27:42: warning: fold-expressions only available with '-std=c++17' or '-std=gnu++17'
   27 |     (..., (cout << d << values, d = "] ["));
      |                                          ^
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 1 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 1 ms 348 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 0 ms 348 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 1 ms 344 KB Output is correct
20 Correct 1 ms 344 KB Output is correct
21 Correct 0 ms 348 KB Output is correct
22 Correct 0 ms 348 KB Output is correct
23 Correct 0 ms 348 KB Output is correct
24 Correct 0 ms 348 KB Output is correct
25 Correct 0 ms 348 KB Output is correct
26 Correct 0 ms 348 KB Output is correct
27 Correct 0 ms 348 KB Output is correct
28 Correct 0 ms 348 KB Output is correct
29 Correct 0 ms 348 KB Output is correct
30 Correct 1 ms 344 KB Output is correct
31 Correct 1 ms 348 KB Output is correct
32 Correct 1 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 604 KB Output is correct
2 Correct 1 ms 600 KB Output is correct
3 Correct 0 ms 604 KB Output is correct
4 Correct 1 ms 604 KB Output is correct
5 Correct 1 ms 604 KB Output is correct
6 Correct 0 ms 604 KB Output is correct
7 Correct 1 ms 604 KB Output is correct
8 Correct 0 ms 600 KB Output is correct
9 Correct 0 ms 604 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 604 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 2364 KB Output is correct
2 Correct 2 ms 2364 KB Output is correct
3 Correct 2 ms 2364 KB Output is correct
4 Correct 2 ms 2380 KB Output is correct
5 Correct 2 ms 2360 KB Output is correct
6 Correct 2 ms 2364 KB Output is correct
7 Correct 2 ms 2364 KB Output is correct
8 Correct 1 ms 348 KB Output is correct
9 Correct 1 ms 348 KB Output is correct
10 Correct 1 ms 1340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 17200 KB Output is correct
2 Correct 11 ms 16176 KB Output is correct
3 Correct 8 ms 16432 KB Output is correct
4 Correct 8 ms 17108 KB Output is correct
5 Correct 9 ms 16944 KB Output is correct
6 Correct 8 ms 17200 KB Output is correct
7 Correct 8 ms 17712 KB Output is correct
8 Correct 2 ms 856 KB Output is correct
9 Correct 4 ms 5880 KB Output is correct
10 Correct 8 ms 15808 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 62036 KB Output is correct
2 Correct 29 ms 62548 KB Output is correct
3 Correct 25 ms 62068 KB Output is correct
4 Correct 27 ms 62292 KB Output is correct
5 Correct 29 ms 62804 KB Output is correct
6 Correct 26 ms 61764 KB Output is correct
7 Correct 20 ms 32088 KB Output is correct
8 Correct 5 ms 1508 KB Output is correct
9 Correct 6 ms 1508 KB Output is correct
10 Correct 20 ms 31580 KB Output is correct
11 Correct 28 ms 61784 KB Output is correct
12 Correct 7 ms 5512 KB Output is correct