Pagini recente » Cod sursa (job #897118) | Cod sursa (job #2901132) | Cod sursa (job #1898491) | Cod sursa (job #2327770) | Cod sursa (job #2462346)
#include <cstdio>
#include <cstring>
#define maxim 1000005
using namespace std;
freopen ("pscpld.in","r",stdin);
freopen ("pscpld.out","w",stdout);
int z[maxim * 2];
int main()
{
string s;
char x;
long long ans = 0;
while (scanf("%d", &x));
{
s += "#";
s += x;
ans ++;
}
s = "!" + s + "#";
int n = s.length();
assert(n < 2 * maxim);
int c = 0, r = 0;
for (int i = 1; i < n; ++ i)
{
int op = 2 * c - i;
if (i > r || z[op] >= r - i)
{
if (i > r)
r = i;
int k = r;
while (k < n && s[k] == s[2 * i - k])
k ++;
k --;
z[i] = k - i;
if (k > c)
{
c = i;
r = k;
}
}
else
z[i] = z[op];
ans += z[i] / 2;
}
printf("%d", ans);
}