Cod sursa(job #923383)

Utilizator MciprianMMciprianM MciprianM Data 23 martie 2013 13:55:42
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <cstring>

using namespace std;

static const int MAXN = 2000001, MAXA = 1000, MOD1 = 666013, MOD2 = 1000037;
char T[MAXN], P[MAXN];
int A[MAXA], kt;

int pre(char s[], int l, int r, int MOD) {
	int ans = 0;
	for(int i = l; i < r; i++) {
		ans = (ans * 256 + s[i]) % MOD;
	}
	return ans;
}

int main() {
	int ans = 0, lP, lT, put1 = 1, put2 = 1;
	ifstream f("strmatch.in");
	f >> P >> T;
	f.close();
	lP = strlen(P);
	lT = strlen(T);
	int p1 = pre(P, 0, lP, MOD1);
	int t1 = pre(T, 0, lP - 1, MOD1);
	int p2 = pre(P, 0, lP, MOD2);
	int t2 = pre(T, 0, lP - 1, MOD2);
	for(int i = 1; i < lP; i++) {
		put1 = (put1 * 256) % MOD1;
		put2 = (put2 * 256) % MOD2;
	}
	for(int i = lP - 1; i < lT; i++) {
		t1 = (t1 * 256 + T[i]) % MOD1;
		t2 = (t2 * 256 + T[i]) % MOD2;
		if(p1 == t1 && p2 == t2) {
			if(kt < 1000)	A[kt++] = i - lP + 1;
			ans++;
		}
		t1 = ((t1 - T[i - lP + 1] * put1) % MOD1 + MOD1) % MOD1;
		t2 = ((t2 - T[i - lP + 1] * put2) % MOD2 + MOD2) % MOD2;
	}
	ofstream g("strmatch.out");
	g << ans << endl;
	for(int i = 0; i < kt; i++) {
		g << A[i] << ' ';
	}
	g << endl;
	g.close();
	return 0;
}