Pagini recente » Cod sursa (job #735785) | Cod sursa (job #803257) | Cod sursa (job #561810) | Cod sursa (job #1597430) | Cod sursa (job #2064084)
#include <bits/stdc++.h>
#define MAX_N 1000000
using namespace std;
typedef long long lint;
string a;
string s;
int pal[MAX_N * 2 + 1];
int n;
void readFile()
{
ifstream f("pscpld.in");
f >> a;
n = a.size();
f.close();
}
void getPal()
{
int c = 0;
int r = 0;
pal[0] = 1;
int i;
for(i = 1; i < 2 * n - 1; i ++)
{
int ogl = c - (i - c);
if(ogl < 0)
ogl = 0;
else
ogl = pal[ogl];
pal[i] = min(max(0, r - i + 1), ogl);
while((i - pal[i] >= 0 && i + pal[i] < 2 * n - 1) && s[i - pal[i]] == s[i + pal[i]])
pal[i] ++;
if(i + pal[i] - 1 > r)
{
r = i + pal[i] - 1;
c = i;
}
}
}
lint rez;
void getRez()
{
int i;
for(i = 0; i < 2 * n - 1; i ++)
{
rez += ((pal[i] - (i & 1) + 1) >> 1);
// cout << pal[i] << " ";
}
//**/ cout << "\n";
}
void getSir()
{
s.resize(2 * n - 1);
int i;
for(i = 0; i < n; i ++)
{
s[i << 1] = a[i];
if(i < n)
s[(i << 1) + 1] = '|';
}/*
for(i = 0; i < 2 * n - 1; i ++)
cout << s[i] << " ";
cout << "\n";*/
}
void solve()
{
getSir();
getPal();
getRez();
}
void printFile()
{
ofstream g("pscpld.out");
g << rez << "\n";
g.close();
}
int main()
{
readFile();
solve();
printFile();
return 0;
}