Cod sursa(job #681888)

Utilizator DSzprogDombi Szabolcs DSzprog Data 17 februarie 2012 23:39:03
Problema Potrivirea sirurilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <cstdio>
#include <cstdlib>

int n;
int m;
char a[2000002];
char b[2000002];

FILE * f1 = fopen("strmatch.in", "rt");
FILE * f2 = fopen("strmatch.out", "wt");

class Hash {
public:
	unsigned int shift;
	unsigned int hash;
	Hash() {
		hash = 0;
	}
	void add(char chr) {
		hash = hash >> 31 | hash << 1;
		hash ^= chr;
	}
	void rem(char chr) {
		hash ^= chr >> (32 - shift) | chr << shift;
	}
};

int main() {
	fscanf(f1, "%s", a);
	fscanf(f1, "%s", b);
	while(a[++n]);
	while(b[++m]);

	Hash ha;
	Hash hb;

	for (int i = 0; i < n; ++i) {
		ha.add(a[i]);
		hb.add(b[i]);
	}
	hb.shift = n % 32;

	int count = 0;
	int first = n - 1;
	fprintf(f2, "        \n");

	for (int i = n; i < m; ++i) {
		hb.add(b[i]);
		hb.rem(b[i - n]);

		if (ha.hash == hb.hash) {
			if (++count <= 1000) {
				fprintf(f2, "%d ", i - first);
			}
		}
	}
	fseek(f2, 0, SEEK_SET);
	fprintf(f2, "%d", count);

	fclose(f1);
	fclose(f2);
}