Submission #1134760

#TimeUsernameProblemLanguageResultExecution timeMemory
1134760cpdreamerPalindromic Partitions (CEOI17_palindromic)C++20
60 / 100
10093 ms3052 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define P pair
#define S second
#define F first
#define all(v) v.begin(),v.end()
#define V vector
#define pb push_back
const ll MOD=998244353;
struct segtree{
private:
    struct node{
        ll ans;
        ll l;
        ll maxl_1;
        ll maxl_2;
        ll maxr_1;
        ll maxr_2;
    };
    node merge(node a,node b){
        if(a.maxl_1==LLONG_MIN)
            return b;
        if(b.maxl_1==LLONG_MIN)
            return a;
        static node c;
        c.l=a.l+b.l;
        c.ans=max(max(a.ans,b.ans),max(b.maxl_1+a.maxr_2-1,b.maxl_2+a.maxr_1-1));
        c.maxl_1=max(a.maxl_1,b.maxl_1-a.l);
        c.maxl_2=max(a.maxl_2,b.maxl_2-a.l);
        c.maxr_1=max(b.maxr_1,a.maxr_1-b.l);
        c.maxr_2=max(b.maxr_2,a.maxr_2-b.l);
        return c;
    }
    node neutral{0,0,LLONG_MIN};
    node single(ll a){
        return{0,1,a,-a,a,-a};
    }
public:
    V<node>query;
    int size;
    void init(int n){
        size=1;
        while(size<n){
            size*=2;
        }
        query.resize(2*size);
    }
    void build(V<int>&a,int x,int lx,int rx){
        if(rx-lx==1){
            if(lx<(int)a.size()){
                query[x]=single(a[lx]);
            }
            return;
        }
        int m=(lx+rx)/2;
        build(a,2*x+1,lx,m);
        build(a,2*x+2,m,rx);
        query[x]=merge(query[2*x+1],query[2*x+2]);
    }
    void build(V<int>&a){
        build(a,0,0,size);
    }
    void update(int i,int v,int x,int lx,int rx){
        if(rx-lx==1){
            query[x]=single(v);
            return;
        }
        int m=(lx+rx)/2;
        if(i<m)
            update(i,v,2*x+1,lx,m);
        else
            update(i,v,2*x+2,m,rx);
    }
    void update(int i,int v){
        update(i,v,0,0,size);
    }
    node calc(int l,int r,int x,int lx,int rx) {
        if (r <= lx || rx >= l)
            return neutral;
        if (lx >= l && rx <= r)
            return query[x];
        int m = (lx + rx) / 2;
        node a = calc(l, r, 2 * x + 1, lx, m);
        node b = calc(l, r, 2 * x + 2, m, rx);
        return merge(a, b);
    }
};
void file() {
    freopen("input.txt.txt", "r", stdin);
    freopen("output.txt.txt", "w", stdout);
}
bool check(string &t1,string t2){
    reverse(all(t2));
    return t1==t2;
}
void solve() {
    string s;
    cin>>s;
    int n=(int)s.length();
    V<string>v1,v2;
    int l=-1,r=n;
    int p1=0,p2=n-1;
    string t1,t2;
    int c=0;
    while(p1<p2){
        t1+=s[p1];
        t2+=s[p2];
        if(check(t1,t2)){
            c+=2;
            l=p1;
            r=p2;
            t1="";t2="";
        }
        p1++;
        p2--;
    }
    if(r-l>1)
        c++;
    cout<<c<<endl;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
   // file();
    int t;
    cin>>t;
    while(t--) {
        solve();
    }
}

Compilation message (stderr)

palindromic.cpp: In function 'void file()':
palindromic.cpp:90:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   90 |     freopen("input.txt.txt", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
palindromic.cpp:91:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |     freopen("output.txt.txt", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...