Pagini recente » Cod sursa (job #972682) | Cod sursa (job #1957043) | Cod sursa (job #207075) | Cod sursa (job #1328976) | Cod sursa (job #1300853)
#include<iostream>
#include<cstdio>
using namespace std;
FILE *f = fopen("pscpld.in", "r");
FILE *g = fopen("pscpld.out", "w");
#define MaxN 1000100
#define Max2N (2 * MaxN)
#define ll long long
int length, dr, pivot;
ll Sol;
char S[MaxN];
int Lung[Max2N], newS[Max2N];
int main()
{
fgets (S, sizeof(S), f);
newS[0] = '#';
for (length=1;S[length];length++)
newS[length<<1] = S[length-1],
newS[(length<<1)-1] = '_';
length <<= 1;
length -- ;
newS[length] = '_';
for (int i=1;i<length;i++)
{
int known = (dr >= i ? 1 : min (Lung[(pivot << 1) - i], dr - i);
while (newS[i - known] == newS[i + known]) known ++;
Lung[i] = known-1;
if (i + known > dr)
dr = i + known,
pivot = i;
Sol += ((Lung[i] + (Lung[i]&1)) >> 1);
}
/* for (int i=1;i<=length;i++)
printf ("%2d ", i);
cout << "\n";
for (int i=1;i<=length;i++)
printf (" %c ", newS[i]);
cout << "\n";
for (int i=1;i<=length;i++)
printf ("%2d ", Lung[i]);
*/
fprintf (g, "%d\n", Sol);
}