Cod sursa(job #2376503)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 8 martie 2019 16:02:10
Problema PScPld Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2 * 1e6 + 20;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
int manacher[MAXN];
char ch[MAXN];
void bruteforce(int i,int marime){
    int l = 1;
    while(ch[i + l] == ch[i - l] and i - l >= 0 and i + l <= marime) l++;
   // fout << l  << "  " << i  << '\n';
    l--;
    manacher[i] += 2 * l;
}
int main()
///cabana
{

    ios::sync_with_stdio(false);
    fin.tie(0);
    fout.tie(0);
    int marime = 0, best = 0;
    long long maxim = 0;
    char x;
    for(int i = 0; i <= MAXN; ++i)
        manacher[i] = 1;
    while(fin.get(x) and x != '\n'){
        ch[marime ++] = '*';
        ch[marime ++] = x;
    }
    ch[marime] = '*';
    for(int i = 1; i < marime; i += 2){
        if(best + manacher[best] / 2 < i){
            bruteforce(i, marime);
            best = i;
            continue;
        }
        manacher[i] = manacher[best - (i - best)];
        if(best + manacher[best]/ 2 <= i + manacher[i] / 2 - 1){
            manacher[i] = min(manacher[i], 2 * (best + manacher[best] / 2  - i) + 1);
            bruteforce(i, marime);
            best = i;
        }
    }
    for(int i = 1; i <= marime; i += 2){
        ///fout << manacher[i] <<  '\n' ;
        ///fout << '\n' << (manacher[i] - 1) / 2;
        maxim += (manacher[i] - 1) / 2;
    }
    fout << maxim;
    return 0;

}