Cod sursa(job #763333)

Utilizator igsifvevc avb igsi Data 1 iulie 2012 20:24:12
Problema Potrivirea sirurilor Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.83 kb
#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;
}