Cod sursa(job #975771)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 21 iulie 2013 16:12:10
Problema Potrivirea sirurilor Scor 78
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define KEY1 100007
#define KEY2 100021

#define DN 2000001
using namespace std;

char x[DN],y[DN];
int rez[1005];

int main()
{
    int p=73,n,m,sz=0;
    int pattern_hash1=0,pattern_hash2=0,string_hash1=0,string_hash2=0,p1=1,p2=1;

    ifstream f("strmatch.in");
    ofstream g("strmatch.out");
    f>>x>>y;
    n=strlen(x);
    m=strlen(y);


    for(int i=0;i<n;++i)
    {
        pattern_hash1=(pattern_hash1*p + x[i])%KEY1;
        pattern_hash2=(pattern_hash2*p + x[i])%KEY2;

        if(i)
            p1=(p1*p)%KEY1,
            p2=(p2*p)%KEY2;
    }

    for(int i=0;i<n;++i)
        string_hash1=( string_hash1*p + y[i] ) % KEY1,
        string_hash2=( string_hash2*p + y[i] ) % KEY2;

    if(string_hash1==pattern_hash1 && string_hash2==pattern_hash2)
        rez[++rez[0]]=0;

    for(int i=n;i<m;++i)
    {
        string_hash1=((string_hash1 - (y[i-n]*p1)%KEY1 + KEY1 )*p +y[i])%KEY1;
        string_hash2=((string_hash2 - (y[i-n]*p2)%KEY2 + KEY2 )*p +y[i])%KEY2;

        if(string_hash1==pattern_hash1 && string_hash2==pattern_hash2)
            {
                if(sz<1000)
                    rez[++sz]=i-n+1;
                    else
                    ++sz;
            }

    }
    g<<sz<<"\n";
    for(int i=1;i<=min(sz,1000);++i)
        g<<rez[i]<<" ";


    return 0;
}