Pagini recente » Cod sursa (job #2226520) | Cod sursa (job #2055951) | Cod sursa (job #904368) | Cod sursa (job #368406) | Cod sursa (job #681888)
Cod sursa(job #681888)
#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);
}