Pagini recente » Cod sursa (job #2950282) | Cod sursa (job #1173397) | Cod sursa (job #2720040) | Cod sursa (job #1435150) | Cod sursa (job #1300845)
#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;
ll Sol;
char S[MaxN];
int mark[Max2N], Lung[Max2N], newS[Max2N];
int main()
{
fgets (S, sizeof(S), f);
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++)
{
//cout << i << " " << Lung[(mark[i] << 1) - i] << "\n";
int known = (mark[i] ? 0 : Lung[(mark[i] << 1) - i]);
for (;newS[i - known] == newS[i + known] &&
i + known <= length && i - known > 0;known ++)
mark[i+known] = i;
Lung[i] = known-1;
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]);
cout << "\n";
for (int i=1;i<=length;i++)
printf ("%2d ", mark[i]);
*/
fprintf (g, "%d\n", Sol);
}