Cod sursa(job #1997059)

Utilizator catalinlupCatalin Lupau catalinlup Data 3 iulie 2017 12:07:21
Problema Potrivirea sirurilor Scor 18
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
#define INFILE "strmatch.in"
#define OUTFILE "strmatch.out"

#define LMAX 2000000
#define NMAX 1000

#include<string.h>

// d is the number of characters in input alphabet
#define d 256

int num=0;
int Loc[NMAX];

 using namespace std;
/* pat -> pattern
    txt -> text
    q -> A prime number
*/
void search(char pat[], char txt[], int q)
{
    int M = strlen(pat);
    int N = strlen(txt);
    int i, j;
    int p = 0; // hash value for pattern
    int t = 0; // hash value for txt
    int h = 1;

    // The value of h would be "pow(d, M-1)%q"
    for (i = 0; i < M-1; i++)
        h = (h*d)%q;

    // Calculate the hash value of pattern and first
    // window of text
    for (i = 0; i < M; i++)
    {
        p = (d*p + pat[i])%q;
        t = (d*t + txt[i])%q;
    }

    // Slide the pattern over text one by one
    for (i = 0; i <= N - M; i++)
    {

        // Check the hash values of current window of text
        // and pattern. If the hash values match then only
        // check for characters on by one
        if ( p == t )
        {
            /* Check for characters one by one */
            for (j = 0; j < M; j++)
            {
                if (txt[i+j] != pat[j])
                    break;
            }

            // if p == t and pat[0...M-1] = txt[i, i+1, ...i+M-1]
            if (j == M)
                Loc[num++]=i;
        }

        // Calculate hash value for next window of text: Remove
        // leading digit, add trailing digit
        if ( i < N-M )
        {
            t = (d*(t - txt[i]*h) + txt[i+M])%q;

            // We might get negative value of t, converting it
            // to positive
            if (t < 0)
            t = (t + q);
        }
    }
}

ifstream in(INFILE);
ofstream out(OUTFILE);

int main()
{

    char txt[LMAX];
    char pat[NMAX];
    in.getline(pat,LMAX);
    in.getline(txt,NMAX);
    search(pat,txt,101);
    if(num>=NMAX)
        out<<NMAX<<"\n";
    else
        out<<num<<"\n";
    for(int i=0;i<num&&i<NMAX;i++)
        out<<Loc[i]<<" ";

    return 0;
}