Nu aveti permisiuni pentru a descarca fisierul grader_test15.in

Cod sursa(job #3151656)

Utilizator mihai.alphamihai craciun mihai.alpha Data 22 septembrie 2023 12:45:03
Problema PScPld Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
#include <iostream>

const int maxlen = 1e6 + 2;

char s[maxlen];
char a[2 * maxlen];
int d[2 * maxlen];

int sLen, N;

int main()  {
	freopen("pscpld.in", "r", stdin);
	freopen("pscpld.out", "w", stdout);
	scanf("%s", s + 1);
	sLen = strlen(s + 1);
	N = 2 * sLen + 1;
	a[1] = '*';
	for(int i = 1;i <= sLen;i++)  {
		a[2 * i] = s[i];
		a[2 * i + 1] = '*';
	}
	int range, index;
	range = 0,
	index = 1;
	long long ans = 0LL;
	int bestRange, bestIndex;
	bestIndex = 1;
	bestRange = 0;
	while(index <= N)  {
		range = 0;
		while(index - range - 1 >= 1 && index + range + 1 <= N &&
			a[index - range - 1] == a[index + range + 1])
				range++;
		d[index] = range;
		if(bestIndex + bestRange <= index + range)  {
			bestIndex = index;
			bestRange = range;
		}else{
			index++;
			continue;
		}
		int maxRange = range;
		int oldIndex = index;
		index++;
		int oppositeIndex = oldIndex - 1;
		while(index <= oldIndex + range && index <= N)  {
			maxRange--;
			d[index] = std::min(d[oppositeIndex], maxRange);
			while(index - d[index] - 1 >= 1 && index + d[index] + 1 <= N &&
				a[index - d[index] - 1] == a[index + d[index] + 1])
					d[index]++;
			oppositeIndex--;
			index++;
		}
	}

	for(int i = 1;i <= N;i++)
		ans += 1LL * (d[i] + 1) / 2;
	printf("%lld\n", ans);
	return 0;
}