Pagini recente » Cod sursa (job #1223035) | Cod sursa (job #2904075) | Cod sursa (job #712795) | Cod sursa (job #134661) | Cod sursa (job #763333)
Cod sursa(job #763333)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define BASE 73
#define MODULO1 100007
#define MODULO2 100021
char pattern[2000001], search[2000001];
int patternHash1, patternHash2, searchHash1, searchHash2, basePow1, basePow2, N, pos[1000];
int main()
{
FILE *in = fopen("strmatch.in", "r");
FILE *out = fopen("strmatch.out", "w");
int patternLength, searchLength, i, j, temp;
fscanf(in, "%s\n%s", pattern, search);
patternLength = strlen(pattern);
searchLength = strlen(search);
basePow1 = basePow2 = 1;
patternHash1 = searchHash1 = patternHash2 = searchHash2 = 0;
for(i = 0; i < patternLength; i++)
{
patternHash1 = (patternHash1 * BASE + pattern[i]) % MODULO1;
searchHash1 = (searchHash1 * BASE + search[i]) % MODULO1;
if(i) basePow1 = (basePow1 * BASE) % MODULO1;
patternHash2 = (patternHash2 * BASE + pattern[i]) % MODULO2;
searchHash2 = (searchHash2 * BASE + search[i]) % MODULO2;
if(i) basePow2 = (basePow2 * BASE) % MODULO2;
}
if(patternHash1 == searchHash1 && patternHash2 == searchHash2)
{
N++;
pos[0] = 0;
}
for(i = patternLength; i < searchLength; i++)
{
searchHash1 = (BASE * ((searchHash1 - basePow1 * search[i-patternLength]) % MODULO1 + MODULO1)
+ search[i]) % MODULO1;
searchHash2 = (BASE * ((searchHash2 - basePow2 * search[i-patternLength]) % MODULO2 + MODULO2)
+ search[i]) % MODULO2;
if(patternHash1 == searchHash1 && patternHash2 == searchHash2)
{
if(N < 1000) pos[N] = i - patternLength + 1;
N++;
}
}
temp = (N < 1000 ? N : 1000);
fprintf(out, "%d\n", N);
for(i = 0; i < temp; i++)
fprintf(out, "%d ", pos[i]);
fprintf(out, "\n");
fclose(in);
fclose(out);
return 0;
}