Cod sursa(job #1129153)

Utilizator axnsanCristi Vijdea axnsan Data 27 februarie 2014 20:27:57
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#ifdef __INFOARENA_PROJ
#include "infoarena.h"
#endif

#include <fstream>
#include <algorithm>

#ifdef __INFOARENA_PROJ
namespace strmatch {
#endif

unsigned const int maxL = 2000000, maxNPrint = 1000;

void buildPrefixTable(const char* W, unsigned* T)
{
	T[0] = -1; T[1] = 0;
	unsigned q = 0, pos = 2;
	while (W[pos] != '\0')
	{
		if (W[pos - 1] == W[q])
			T[pos++] = ++q;
		else if (q == 0)
			T[pos++] = 0;
		else while (q > 0)
			q = T[q];
	}
}

int main()
{
	std::ifstream in("strmatch.in");
	std::ofstream out("strmatch.out");
	char A[maxL + 3], B[maxL + 3];
	unsigned lenA, lenB;
	unsigned T[maxL + 1];
	in.getline(A, maxL + 1);
	lenA = (unsigned) in.gcount() - 1;
	in.getline(B, maxL + 1);
	lenB = (unsigned) in.gcount() - 1;
	if (B[lenB] != '\0')
		++lenB;

	buildPrefixTable(A, T);
	unsigned offset;
	if (lenA > 1)
		offset = lenA - T[lenA - 1] - 1;
	else offset = 1;

	unsigned m = 0, i = 0;
	unsigned N = 0, pos[maxNPrint + 1];
	while (B[m + i] != '\0')
	{
		if (A[i] == B[m + i])
		{
			if (i == lenA - 1)
			{
				if (++N <= 1000)
					pos[N] = m;
				m = m + offset, i = 0;
			}
			++i;
		}
		else if (i == 0)
			++m;
		else /*i > 0*/
			m = m + i - T[i], i = T[i];
	}

	out << N << '\n';
	for (unsigned i = 1; i <= N; ++i)
		out << pos[i] << ' ';
	out << '\n';

	return 0;
}

#ifdef __INFOARENA_PROJ
}
#endif