Cod sursa(job #1227497)

Utilizator andrei_toaderToader Andrei Sorin andrei_toader Data 10 septembrie 2014 19:22:15
Problema PScPld Scor 100
Compilator cpp Status done
Runda ubb_acm_2014_etapa_individuala_01 Marime 1.47 kb
#include <cstdio>
#include <cstring>

using namespace std;

int v[1000111];
char s[1000111];

inline int min(int a, int b) {
    if (a<b) return a;
    else return b;
}


int main() {

    freopen("pscpld.in", "r", stdin);
    freopen("pscpld.out", "w", stdout);
    scanf("%s", s+1);
    int n = strlen(s+1);
    int st = 1;
    int dr = 1;
    long long Rez = 0;
    for (int j =1 ; j<=n; Rez += v[j++]+1)
        if (j<=dr) {
            v[j] = min(v[st+dr-j], dr - j);
            if (j+v[j] == dr)
                 for (st = j - v[j], dr = j + v[j]; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
                    v[j] += 1;
        }
        else {
            for (st = dr = j; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
                v[j] += 1;
        }

        st =1;
        dr = 2;
        for (int j = 1; j<n; ++j) {
            if (s[j] == s[j+1]) {
                if (j<=dr) {
                    v[j] = min (v[st + dr - j - 1], dr - j - 1);
                    for (st = j - v[j], dr = j + v[j] + 1; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
                    v[j] += 1;
            } else {
                for (dr = (st = j) + 1; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
                    v[j] += 1;
            }
            Rez+=v[j]+1;
                }
                else v[j] = 0;
            }

            printf("%lld", Rez);
            return 0;
        }