답안 #946748

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
946748 2024-03-15T02:31:28 Z yeediot 회문 (APIO14_palindrome) C++17
100 / 100
15 ms 37272 KB
#include<bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define pii pair<int,int>
#define pb push_back
#define sz(x) (int)(x.size())
#define chmin(x,y) x=min(x,y)
#define chmax(x,y) x=max(x,y)
#define vi vector<int>
#define vp vector<pii>
#define vvi vector<vi>
#define ykh mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count())
#define __lg(x) 63-__builtin_clzll(x)
#define pow2(x) (1LL<<x)
void __print(int x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef local
void setio(){freopen("/Users/iantsai/Library/Mobile Documents/com~apple~CloudDocs/cpp/Empty.md","r",stdin);}
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
void setio(){}
#define debug(x...)
#endif
void setIO(string s) {
    freopen((s + ".in").c_str(), "r", stdin);
    freopen((s + ".out").c_str(), "w", stdout);
}
struct line{
    int a,b;
    int operator()(const int x)const{
        return a*x+b;
    }
};
bool check(line l1,line l2,line l3){
    return (l3.b-l2.b)*(l1.a-l2.a)<=(l2.b-l1.b)*(l2.a-l3.a);
}
const int mxn=3e5+5;
struct Palindromic_Tree{
    int next[mxn][26];//
    int fail[mxn];//跟kmp一樣,存次長以該節點為結尾的回文
    int cnt[mxn];//存一個回文有幾個
    int num[mxn];//存該節點最長回文的數量
    int len[mxn];//存該節點最長回文的長度
    int s[mxn];//存字元
    int last;//上一個插入的節點
    int n;//字串位置指針
    int p;//節點指針

    int newnode(int l){
        for(int i=0;i<26;i++){
            next[p][i]=0;
        }
        cnt[p]=0;
        num[p]=0;
        len[p]=l;
        return p++;
    }

    void init(){
        p=0;
        newnode(0);//偶數長度
        newnode(-1);//奇數長度
        last=0;
        n=0;
        s[0]=-1;
        fail[0]=1;
    }

    int get_fail(int x){
        while(s[n-1-len[x]]!=s[n]){
            x=fail[x];
        }
        return x;
    }

    void add(int c){
        c-='a';
        s[++n]=c;
        int cur=get_fail(last);
        if(!next[cur][c]){
            int now=newnode(len[cur]+2);
            fail[now]=next[get_fail(fail[cur])][c];//now的次長=last的次長+c,所以要找兩次fail(last->cur->get_fail(cur))
            next[cur][c]=now;
            num[now]=num[fail[now]]+1;
        }
        last=next[cur][c];
        cnt[last]++;
    }

    void count(){
        for(int i=p-1;i>=0;i--){
            cnt[fail[i]]+=cnt[i];
        }
    }
}tree;
signed main(){
    setio();
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    string s;
    cin>>s;
    tree.init();
    for(auto c:s){
        tree.add(c);
    }
    tree.count();
    long long ans=0;
    for(int i=1;i<tree.p;i++){
        debug(tree.len[i],tree.cnt[i]);
        chmax(ans,(long long)tree.cnt[i]*tree.len[i]);
    }
    cout<<ans<<'\n';
}
 /*
 input:
 
 */















 

Compilation message

palindrome.cpp: In function 'void setIO(std::string)':
palindrome.cpp:41:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |     freopen((s + ".in").c_str(), "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
palindrome.cpp:42:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |     freopen((s + ".out").c_str(), "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6620 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6492 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6488 KB Output is correct
9 Correct 1 ms 6488 KB Output is correct
10 Correct 1 ms 6492 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 ms 6492 KB Output is correct
13 Correct 1 ms 6492 KB Output is correct
14 Correct 1 ms 6492 KB Output is correct
15 Correct 1 ms 6492 KB Output is correct
16 Correct 1 ms 6492 KB Output is correct
17 Correct 1 ms 6492 KB Output is correct
18 Correct 1 ms 6492 KB Output is correct
19 Correct 1 ms 6492 KB Output is correct
20 Correct 1 ms 6492 KB Output is correct
21 Correct 1 ms 6492 KB Output is correct
22 Correct 1 ms 6492 KB Output is correct
23 Correct 1 ms 6492 KB Output is correct
24 Correct 1 ms 6492 KB Output is correct
25 Correct 1 ms 6492 KB Output is correct
26 Correct 1 ms 6492 KB Output is correct
27 Correct 1 ms 6492 KB Output is correct
28 Correct 2 ms 6492 KB Output is correct
29 Correct 1 ms 6488 KB Output is correct
30 Correct 2 ms 6492 KB Output is correct
31 Correct 1 ms 6492 KB Output is correct
32 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6488 KB Output is correct
4 Correct 1 ms 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 1 ms 6492 KB Output is correct
8 Correct 1 ms 6488 KB Output is correct
9 Correct 1 ms 6488 KB Output is correct
10 Correct 1 ms 6740 KB Output is correct
11 Correct 1 ms 6492 KB Output is correct
12 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 8796 KB Output is correct
2 Correct 1 ms 8796 KB Output is correct
3 Correct 1 ms 8796 KB Output is correct
4 Correct 1 ms 8796 KB Output is correct
5 Correct 2 ms 8796 KB Output is correct
6 Correct 2 ms 8692 KB Output is correct
7 Correct 1 ms 8792 KB Output is correct
8 Correct 1 ms 6492 KB Output is correct
9 Correct 1 ms 6492 KB Output is correct
10 Correct 1 ms 8796 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 17500 KB Output is correct
2 Correct 5 ms 17580 KB Output is correct
3 Correct 5 ms 17500 KB Output is correct
4 Correct 5 ms 17500 KB Output is correct
5 Correct 4 ms 17752 KB Output is correct
6 Correct 4 ms 15452 KB Output is correct
7 Correct 4 ms 17500 KB Output is correct
8 Correct 2 ms 7260 KB Output is correct
9 Correct 3 ms 11432 KB Output is correct
10 Correct 4 ms 17628 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 37092 KB Output is correct
2 Correct 13 ms 37272 KB Output is correct
3 Correct 12 ms 37092 KB Output is correct
4 Correct 12 ms 37088 KB Output is correct
5 Correct 12 ms 37092 KB Output is correct
6 Correct 11 ms 37088 KB Output is correct
7 Correct 11 ms 35040 KB Output is correct
8 Correct 5 ms 8164 KB Output is correct
9 Correct 5 ms 8164 KB Output is correct
10 Correct 11 ms 35044 KB Output is correct
11 Correct 11 ms 37184 KB Output is correct
12 Correct 6 ms 12260 KB Output is correct