Cod sursa(job #2151300)

Utilizator BahamutLux Arcadia Bahamut Data 4 martie 2018 12:37:21
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <cstdio>
#include <cstring>
#include <cassert>
 
using namespace std;
 
char ss[1000005], s[2000005];
int p[2000005];
 
void solve(int poz, int n) {
    while(poz + p[poz] <= n && poz - p[poz] > 0 && s[poz + p[poz]] == s[poz - p[poz]]) {
        ++ p[poz];
    }
    -- p[poz];
}
 
int main() {
    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
 
    int n, aux, j, st, dr;
    long long rasp = 0;
 
    gets(ss);
    n = strlen(ss);
    aux = 0;
	assert(n < 700000);
    for(int i = 0; i < n; ++ i) {
        aux += 2;
        s[aux] = ss[i];
    }
    ++ aux;
    n = aux;
 
    j = 1;
    for(int i = 2; i < n; ++ i) {
        aux = 2 * j - i;
        st = j - p[j];
        dr = j + p[j];
        if(i > dr) {
            solve(i, n);
            j = i;
        } else
        if(aux - p[aux] > st) {
            p[i] = p[aux];
        } else {
            
            solve(i, n);
            j = i;
        }
        rasp += (p[i] + 1) / 2;
    }
 
    printf("%lld", rasp);
 
    return 0;
}