Pagini recente » Cod sursa (job #2609337) | Cod sursa (job #807202) | Cod sursa (job #2239604) | Cod sursa (job #2609167) | Cod sursa (job #2650361)
#include <bits/stdc++.h>
using namespace std;
ifstream in("pscpld.in");
ofstream out("pscpld.out");
const int NMAX = 1000007;
string rd;
char s[2*NMAX + 7];
int lp[2*NMAX + 7];
int main()
{
in >> rd;
int n = rd.size();
s[0] = '|';
for(int i = 0; i < n; i++)
{
s[2*i + 1] = rd[i];
s[2*i + 2] = '|';
}
for(int i = 0; i < 2*n+1; i++)
{
int len;
for(len = lp[i]; i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]; len++) {if(i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]) lp[i] = len; }
len = lp[i];
for(int cpy = 1; cpy <= len; cpy++)
{
lp[i + cpy] = min(lp[i - cpy], max(0, (i - cpy) - (i - len) - 1));
}
}
/*for(int i = 0; i < 2*n+1; i++)
cout << lp[i] << " ";
cout << endl;*/
for(int i = 0; i < 2*n+1; i++)
{
int len;
for(len = lp[i]; i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]; len++) {if(i - len >= 0 && i + len < 2*n+1 && s[i-len] == s[i+len]) lp[i] = len; }
}
/*for(int i = 0; i < 2*n+1; i++)
cout << lp[i] << " ";
cout << endl;*/
long long sum = 0;
for(int i = 0; i < 2*n+1; i++)
{
if(i%2 == 1)
{
sum += (lp[i]+1)/2;
}
else
{
sum += (lp[i])/2;
}
}
out << sum;
}