Cod sursa(job #2802540)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 18 noiembrie 2021 12:39:36
Problema PScPld Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <stdio.h>
#include <string>

FILE *fin, *fout;
const int NMAX = 1e6;

int N;
long long cnt;
char c_s[NMAX];
std :: string s;
int pal[2 * NMAX + 2];


int main() {
	fin = fopen("pscpld.in", "r");

	fscanf(fin, "%s", c_s);

	fclose(fin);

	for(int i = 0; c_s[i]; i++) {
		s.push_back('#');
		s.push_back(c_s[i]);
	}

	s.push_back('#');

	N = s.size();

	for(int i = 0; i < N; i++) {
		printf("%c ", s[i]);
	}

	printf("\n");

	for(int i = 0, l = 0, r = -1, k; i < N; i++) {
		if(i > r) {
			k = 1;
		} else {
			k = std :: min(pal[r + l - i], r - i + 1);
		}

		while(i - k >= 0  && i + k < N && s[i - k] == s[i + k]) {
			k++;
		}

		pal[i] = k--;

		if(i + k > r) {
			r = i + k;
			l = i - k;
		}

		cnt += (pal[i] >> 1LL);
	}


	for(int i = 0; i < N; i++) {
		printf("%d ", pal[i]);
	}

	printf("\n");

 	fout = fopen("pscpld.out", "w");

 	fprintf(fout, "%lld\n", cnt);

	fclose(fout);
	return 0;
}