Pagini recente » Cod sursa (job #146509) | Cod sursa (job #1686478) | Cod sursa (job #68583) | Cod sursa (job #1340706) | Cod sursa (job #1805195)
#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]];
}