Cod sursa(job #1576889)

Utilizator lflorin29Florin Laiu lflorin29 Data 22 ianuarie 2016 22:26:15
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <bits/stdc++.h>

using namespace std;

string S;

void citire() {
    string tmp;
    ifstream("pscpld.in") >> tmp;
    for(int i = 0; i < (int)tmp.size(); ++i) {
        S += tmp[i]; S += '$';
    }
}

void solve() {
    vector<int>dp(S.size());
    int idx = 0;
    long long ret = 0;
    dp[0] = 1;
    for(int i = 1; i < (int)S.size(); ++i) {
        int fact = max(1, min(dp[idx] + idx - i, dp[idx * 2 - i]));
        int L = i - fact, R = i + fact;
        dp[i] = fact;
        while(L >= 0 && R < (int)S.size() && S[L] == S[R]) {
             --L, ++R;
             dp[i]++;
        }

        if(i + dp[i] > idx + dp[idx])
            idx = i;
    }

    for(int i = 0; i < (int)S.size(); ++i) {
        auto it = S[i] != '$';
        ret += (dp[i] + it) >> 1;
    }

    ofstream("pscpld.out") << ret;
}

int main() {
    citire();
    solve();
    return 0;
}