Pagini recente » Cod sursa (job #766357) | Cod sursa (job #697967) | Cod sursa (job #1294268) | Cod sursa (job #266731) | Cod sursa (job #1736236)
///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;
}