Cod sursa(job #2211092)

Utilizator bebeetarepredescu bebeetare Data 9 iunie 2018 13:14:56
Problema Potrivirea sirurilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>
#define nr1 666013
#define nr2 10003

using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");
int n,m,h1,h2,x1,x2,p1,p2,i;
char a[2000005],b[2000005];
vector <int > sol;
int main()
{
    f.getline(a,2000005);
    n=strlen(a);
    f.getline(b,2000005);
    m=strlen(b);
    for(i=0;i<n;i++)
    {
        h1=((h1*127)%nr1+(a[i]-'0'))%nr1;
        h2=((h2*131)%nr2+(a[i]-'0'))%nr2;
        x1=((x1*127)%nr1+(b[i]-'0'))%nr1;
        x2=((x2*131)%nr2+(b[i]-'0'))%nr2;
    }
    p1=p2=1;
    for(i=1;i<n;i++)
    {
        p1=(p1*127)%nr1;
        p2=(p2*131)%nr2;
    }
    if(x1==h1 && x2==h2)
    {
        sol.push_back(0);
    }
    for(i=n;i<m;i++)
    {
        x1=((x1-((b[i-n]-'0')*p1)%nr1+nr1)*127+(b[i]-'0'))%nr1;
        x2=((x2-((b[i-n]-'0')*p2)%nr2+nr2)*131+(b[i]-'0'))%nr2;
        if(x1==h1 && x2==h2)
        {
            sol.push_back(i-n+1);
        }
    }
    g<<sol.size()<<'\n';
    if(sol.size()>1000)
    {
        for(i=0;i<1000;i++)
        {
            g<<sol[i]<<" ";
        }
    }
    else
    {
        for(i=0;i<sol.size();i++)
        {
            g<<sol[i]<<" ";
        }
    }
    return 0;
}