제출 #1269952

#제출 시각아이디문제언어결과실행 시간메모리
1269952ptr_dipra회문 (APIO14_palindrome)C++20
0 / 100
0 ms320 KiB
#include <bits/stdc++.h>
using namespace std;
#define fast {ios_base::sync_with_stdio(false); cin.tie(0);}
typedef long long ll;
#define int long long
#define float long double
class eertree{
public:
    //string must be 1 indexed
    vector<vector<int>> tree;
    int n, t, idx;
    vector<int> len, link, cnt;
    eertree(int sz){
        n=sz;
        len.resize(n+5);
        link.resize(n+5);
        tree.resize(n+5, vector<int>(26,0));
        cnt.resize(n+5,0);
        t=idx=2;
        len[1]=-1, len[2]=0;
        link[1]=link[2]=1;
    }
    void extend(string &s, int p)
    {
        while(s[p-len[t]-1]!=s[p]) t=link[t];
        int x=link[t];
        while(s[p-len[x]-1]!=s[p]) x=link[x];
        int c=s[p]-'a';
        if(!tree[t][c])
        {
            tree[t][c]=++idx;
            len[idx]=len[t]+2;
            link[idx]=(len[idx]==1?2:tree[x][c]);
        }
        t=tree[t][c];
        cnt[t]++;
    }
};
signed main()
{
    fast
    string s;
    cin >> s;
    eertree tr(s.size());
    s="@"+s;
    for(int i=1;i<s.size();i++) tr.extend(s,i);
    int ans=0;
    for(int i=tr.idx;i>2;i--) tr.cnt[tr.link[i]]+=tr.cnt[i];
    for(int i=3;i<=tr.idx;i++) ans+=tr.cnt[i]*tr.len[i];
    cout <<ans << '\n';
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...