Cod sursa(job #1805195)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 13 noiembrie 2016 15:39:41
Problema PScPld Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <fstream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
using namespace std;
using ll = long long;
using uint = unsigned int;
using ull = unsigned long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define NMAX 10005

struct node
{
    int suffLink, num, lg;
    map<char, int> next;

    node(int _lg = 0, int _num = 0, int _suffLink = 0) : lg(_lg), num(_num), suffLink(_suffLink) {}
};

int num, suff;
char s[NMAX];
node v[NMAX];

void addLetter(int);

int main()
{
	int i, n;
    long long nr;
	ifstream fin("pscpld.in");
	ofstream fout("pscpld.out");

    v[0] = node(-1, 0, 0);
    v[1] = node(0, 0, 0);
    num = 2;

    fin >> s + 1;
    for (nr = 0, i = 1; s[i]; ++i)
    {
        addLetter(i);
        nr += v[suff].num;
    }

    fout << nr << '\n';

	fin.close();
	fout.close();

	return 0;
}

void addLetter(int i)
{
    while (suff > 0 && s[i] != s[i - v[suff].lg - 1]) suff = v[suff].suffLink;

    auto it = v[suff].next.find(s[i]);
    if (it != v[suff].next.end()) { suff = it->second; return; }

    if (v[suff].lg + 2 == 1)
    {
        v[num++] = node(1, 1, 1);
        v[suff].next[s[i]] = num - 1;
        suff = num - 1;
        return;
    }

    int link;
    for (link = v[suff].suffLink; link > 0 && s[i] != s[i - v[link].lg - 1]; link = v[link].suffLink);
    link = v[link].next[s[i]];

    v[num++] = node(v[suff].lg + 2, 1 + v[link].num, link);
    v[suff].next[s[i]] = num - 1;

    suff = v[suff].next[s[i]];
}