Cod sursa(job #3236034)

Utilizator StefanStratonStefan StefanStraton Data 25 iunie 2024 19:14:35
Problema Potrivirea sirurilor Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.26 kb
#include <fstream>
#include <cstring>

#define MAXN 2000001

#define P 77
#define MOD1 100007
#define MOD2 100021

using namespace std;

ifstream in ("strmatch.in"); ofstream out ("strmatch.out");


char A[MAXN], B[MAXN];
int lgA, lgB;

int nrAmod1, nrAmod2, P1, P2, nrBmod1, nrBmod2;


char match[MAXN];

int main(){

	in >> A >> B;
	lgA = strlen(A);
	lgB = strlen(B);

	P1 = P2 = 1;
	for (int i = 0; i < lgA; i++){
		nrAmod1 = (nrAmod1 * P + A[i]) % MOD1;
		nrAmod2 = (nrAmod2 * P + A[i]) % MOD2;

		if (i != 0)
			P1 = (P1 * P) % MOD1,
			P2 = (P2 * P) % MOD2;
	}

	if (lgA > lgB){
		out << 0;
		return 0;
	}

	for (int i = 0; i < lgA; i++)
		nrBmod1 = (nrBmod1 * P + B[i]) % MOD1,
		nrBmod2 = (nrBmod2 * P + B[i]) % MOD2;

	int Nr = 0;
	if (nrBmod1 == nrAmod1 && nrBmod2 == nrAmod2)
		match[0] = 1, Nr++;

	for (int i = lgA; i < lgB; i++){
		nrBmod1 = ((nrBmod1 - (B[i - lgA] * P1) % MOD1 + MOD1) * P + B[i]) % MOD1;
		nrBmod2 = ((nrBmod2 - (B[i - lgA] * P2) % MOD2 + MOD2) * P + B[i]) % MOD2;

		if (nrBmod1 == nrAmod1 && nrBmod2 == nrAmod2)
			match[ i - lgA + 1 ] = 1, Nr++;
	}
	out << Nr;

	Nr = 0;
	for (int i = 0; i < lgB && Nr < 1000; i++)
		if (match[i])
			Nr++,
			out << i;
	out << endl;

	return 0;
}