Cod sursa(job #1293377)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 15 decembrie 2014 20:37:31
Problema PScPld Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 kb
#include<cstdio>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<bitset>
#include<deque>
#include<queue>
#include<set>
#include<map>
#include<cmath>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<unordered_map>

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define pll pair<ll,ll>

using namespace std;

const int nmax = 1000005;

struct node
{
    int chain;
    int sufflink;
    int len;
    int next[26];
};

node tree[nmax];

int i, n, cnt, l, maxsuff, sub, sublen;
ll sol;
char s[nmax];

void init()
{
    cnt = 2;
    maxsuff = 2;

    tree[1].len = -1;
    tree[1].sufflink = 1;

    tree[2].len = 0;
    tree[2].sufflink = 1;
}

void add(int poz)
{
    sub = maxsuff;
    sublen = tree[sub].len;
    l = s[poz] - 'a';

    for(;;)
    {
        if(poz - 1 - sublen >= 0 && s[poz] == s[poz - 1 - sublen])
            break;

        sub = tree[sub].sufflink;
        sublen = tree[sub].len;
    }

    if(tree[sub].next[l])
    {
        maxsuff = tree[sub].next[l];
        return;
    }

    cnt++;
    maxsuff = cnt;
    tree[cnt].len = tree[sub].len + 2;
    tree[sub].next[l] = cnt;

    if(tree[cnt].len == 1)
    {
        tree[cnt].sufflink = 2;
        tree[cnt].chain = 1;
        return;
    }

    sub = tree[sub].sufflink;
    sublen = tree[sub].len;

    for(;;)
    {
        if(poz - 1 - sublen >= 0 && s[poz] == s[poz - 1 - sublen])
        {
            tree[cnt].sufflink = tree[sub].next[l];
            break;
        }

        sub = tree[sub].sufflink;
        sublen = tree[sub].len;
    }

    tree[cnt].chain = 1 + tree[tree[cnt].sufflink].chain;
}

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

    scanf("%s", s);
    n = strlen(s);

    init();

    for(i = 0; i < n; i++)
    {
        add(i);
        sol += tree[maxsuff].chain;
    }

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

    return 0;
}