Pagini recente » Cod sursa (job #1619513) | Cod sursa (job #158167) | Cod sursa (job #1165183) | Cod sursa (job #1131152) | Cod sursa (job #1752415)
#include<bits/stdc++.h>
using namespace std;
struct state {
int len, link, cnt;
map<char, int> next;
};
int i, last = 1, sz = 2, n, rs;
state sft[1000005];
string s;
void addLetter(int poz) {
char c = s[poz];
int p = last;
while(p != -1 && c != s[poz - sft[p].len - 1]) p = sft[p].link;
if(p == -1) return void(last = 1);
if(sft[p].next.count(c)) last = sft[p].next[c], ++rs;
else {
int q = sz++;
sft[q].len = sft[p].len + 2;
sft[p].next[c] = q;
p = sft[p].link;
while(p !=-1 && c != s[poz - sft[p].len - 1]) p = sft[p].link;
if(p == -1) p = 1; else p = sft[p].next[c];
sft[q].link = p; last = q;
sft[q].cnt = 1 + sft[p].cnt;
rs += sft[q].cnt;
}
}
int main()
{
ios_base::sync_with_stdio(0);
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
cin >> s; s = "#" + s;
n = s.length();
sft[0].len = sft[0].link = -1;
for(i = 1; i < n; ++i) addLetter(i);
cout << rs << '\n';
return 0;
}