Cod sursa(job #1959945)

Utilizator anamaria41Raicu Ana anamaria41 Data 10 aprilie 2017 01:44:06
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("strmatch.in");
ofstream g("strmatch.out");

#define K 666013
#define Q 10003

int h1,h2,m,n,i,sol[10005],s,nr,v1,v2,p1,p2;
char a[2000050],b[2000050];

int main()
{
    f.getline(a,2000012);
    f.getline(b,2000012);

    m=strlen(a);
    n=strlen(b);

    p1=1;
    p2=1;

    for(i=0; i<m; ++i)
    {
        h1=( h1*101%K + (int)a[i])%K;
        h2=( h2*109%Q + (int)a[i])%Q;
        v1=( v1*101%K + (int)b[i])%K;
        v2=( v2*109%Q + (int)b[i])%Q;


        if (i>0)
        {
            p1*=101;
            p1%=K;
            p2*=109;
            p2%=Q;
        }
    }


    if (v1==h1 && v2==h2)
    {
        nr++;
        sol[++s]=i-m;
    }


    for (i=m; i<n; i++)
    {
        v1 = (( v1-( int (b[i-m])*p1 ) % K + K) * 101 + int(b[i])) % K;
        v2 = (( v2- (int (b[i-m])*p2 ) % Q + Q) * 109 + int(b[i])) % Q;
        if (v1==h1 && v2==h2)
        {
            nr++;
            if(nr<=1000)
            sol[++s]=i-m+1;
        }

    }


    g<<nr<<'\n';

    for(i=1; i<=s; ++i)
        g<<sol[i]<<" ";


    return 0;
}