Cod sursa(job #1736236)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 1 august 2016 14:22:46
Problema PScPld Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
///palindromic tree
#include <bits/stdc++.h>

using namespace std;

const int nmax = 1e6 + 10;

struct Tree
{
    int number , link , length;
    int letter[26];
};

int n;
long long ans;
char s[nmax];

int nrNodes , actNode;

Tree tree[nmax];

void initTree()
{
    nrNodes = 2; actNode = 2;
    tree[1].length = -1; tree[1].link = 1;
    tree[2].length = 0; tree[2].link = 1;
}

int newPalindromes(int pos)
{
    int act = actNode;

    for (act = actNode; ; act = tree[act].link)
    {
        int actL = tree[act].length;
        if (pos - actL - 1 > 0 && s[pos-actL-1] == s[pos])
            break;
    }

    if (tree[act].letter[s[pos]-'a'])
    {
        actNode = tree[act].letter[s[pos]-'a'];
        return tree[actNode].number;
    }

    nrNodes++; actNode = nrNodes;
    tree[act].letter[s[pos]-'a'] = nrNodes;
    tree[nrNodes].length = tree[act].length + 2;

    if (act == 1)
    {
        tree[nrNodes].link = 2;
        return tree[nrNodes].number = 1;
    }

    for (act = tree[act].link ; ; act = tree[act].link)
    {
        int actL = tree[act].length;
        if (pos - actL - 1 > 0 && s[pos-actL-1] == s[pos])
            break;
    }

    act = tree[act].letter[s[pos]-'a'];

    tree[nrNodes].link = act;
    return tree[nrNodes].number = 1 + tree[act].number;
}

int main()
{
    freopen("pscpld.in","r",stdin);
    freopen("pscpld.out","w",stdout);

    gets(s + 1);
    n = strlen(s + 1);

    initTree();
    for (int i = 1; i <= n; ++i)
        ans += newPalindromes(i);

    printf("%lld\n", ans);

    return 0;
}