Cod sursa(job #2063389)

Utilizator alex2kamebossPuscasu Alexandru alex2kameboss Data 11 noiembrie 2017 11:14:30
Problema Potrivirea sirurilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#define MOD 101

using namespace std;
string txt,p;
vector <int> putere,sol;
int h,l,lt,put;
int rp(int n,int p)
{
    int r=1;
    while(p!=0)
    {
        if(p%2==0)
        {
            n=(n*n)%MOD;
            p=p/2;

        }
        else
        {
            r=(r*n)%MOD;
            p=p-1;

        }
    }
    return r;
}
int main()
{
    freopen("strmatch.in","r",stdin);
    //freopen("strmatch.out","w",stdout);
    getline(cin,p);
    getline(cin,txt);
    l=p.length();
    lt=txt.length();
    put=1;
    h=p[0]%MOD;
    int loc=txt[0]%MOD;
    for(int i=1;i<l;i++)
    {
        h=(h*256+p[i])%MOD;
        put=put*256%MOD;
        loc=(loc*256+txt[i])%MOD;
    }
    for(int i=l;i<lt;i++)
    {
        if(loc==h)
        {
            if(p==txt.substr(i-l,l))
                sol.push_back(i-l);
        }
        loc=(((loc-(txt[i-l]*put%101)+101)*256%101)+txt[i])%101;
    }
    if(loc==h)
        {
            if(p==txt.substr(lt-l,l))
                sol.push_back(lt-l);
        }
    int ll=sol.size();
    cout<<ll<<"\n";
    ll=min(ll,1000);
    for(int i=0;i<ll;i++)
        cout<<sol[i]<<" ";
    return 0;
}