Pagini recente » Cod sursa (job #2931081) | Cod sursa (job #64594) | Cod sursa (job #1379425) | Cod sursa (job #1022722) | Cod sursa (job #598456)
Cod sursa(job #598456)
//S.C.
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
char s[2100000];
int P[2100000];
int main()
{
ifstream f("pscpld.in");
f >> s;
int i, j, n, m;
long long sum = 0;
n = strlen(s);
for(i = 2*n-1; i >= 0; i--){
if(i%2)
s[i] = '#';
else s[i] = s[i/2];
}
P[0] = 0;
m = 0;
for(i = 1; i <= 2*n - 1; i++){
j = 0;
if(m + P[m] >= i){
j = P[2*m - i];
if(j > m + P[m] - i)
j = m + P[m] - i;
}
P[i] = j;
while(i - P[i] - 1 >= 0 && i + P[i] + 1 <= 2*n - 1 && s[i + P[i] + 1] == s[i - P[i] - 1])
P[i]++;
if(i + P[i] >= m + P[m])
m = i;
if(i%2)
sum += (P[i] +1) / 2;
else sum += P[i]/2 + 1;
cout << P[i] << " ";
}
sum++;
ofstream g("pscpld.out");
g << sum << "\n";
return 0;
}