Cod sursa(job #1780070)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 15 octombrie 2016 20:33:21
Problema Potrivirea sirurilor Scor 14
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>

#define prime 73
#define NMax 2000005
using namespace std;
ifstream f("strmatch.in");
ofstream g("strmatch.out");

char x[NMax],y[NMax];
int pw[NMax];
int Hx,Hy,Sx,Sy;
vector<int> ans;

int ch(char x){
    if(x >='a')
        return (x - 'a' + 1);
    else
        return (x - 'A' + 1);
}
int main()
{
    f.getline(x,NMax);
    f.getline(y,NMax);
    Sx = strlen(x);
    Sy = strlen(y);

    pw[0] = 1;
    for(int i = 1; i <= Sx; ++i)
        pw[i] = pw[i - 1] * prime;///precalculez pow(prim,i);
    for(int i = 0; i < Sx; ++i)
        Hx += ch(x[i]) * pw[i];///calculez hashul substringului

    for(int i = 0; i < Sx; ++i)///calculez hashul primelor Sx litere din text
        Hy += ch(y[i]) * pw[i];

    for(int i = 1; i <= Sy - Sx + 1; ++i){
        ///verific Hy
        g << Hy << ' ';
        if(Hy == Hx){   ///verific coliziunea in hash
            bool ok = true;
            for(int j = 0; ok && j < Sx; ++j)
                if(x[j] != y[j + i - 1])
                    ok = false;
            if(ok == true)
                ans.push_back(i);
        }
        if(i == Sy)
            break;
        Hy -= 1;
        Hy /= prime;
        Hy += (ch(y[i + Sx - 1]) * pw[Sx - 1]);
    }
    g << ans.size() << '\n';
    for(int i = 0; i < ans.size(); ++i){
        g << ans[i] - 1 << ' ';
    }
    return 0;
}