Cod sursa(job #2195306)

Utilizator adc98Adam Cristian adc98 Data 15 aprilie 2018 22:43:44
Problema Potrivirea sirurilor Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <fstream>
#include <cstring>

using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");

char s[2000001],p[2000001];

int badCharacter[256];

int sol[1001],nrElemente;

void calculCaracterRau()
{
    for(int i=0;i<256;++i) badCharacter[i]=-1;
    for(int i=0;i<strlen(p);++i) badCharacter[(int) p[i]]=i;
}

void BoyerMoore()
{
    int lg_s=strlen(s);
    int lg_p=strlen(p);

    calculCaracterRau();

    int i=0;
    while( i <= (lg_s-lg_p) )
        {
         int j=lg_p-1;
         while(j>=0 && s[i+j]==p[j]) j--;
         if(j<0)
            {
             if(nrElemente<1000) sol[nrElemente++]=i;
              else nrElemente++;
             if(i+lg_p < lg_s) i+=lg_p - badCharacter[(int) s[i+lg_p]];
              else i++;
            }
          else i+=max(1,j-badCharacter[(int) s[i+j]]);
        }
}

int main()
{
    fin.getline(p,2000001);
    fin.getline(s,2000001);
    BoyerMoore();
    fout<<nrElemente<<"\n";
    if(nrElemente>1000) nrElemente=1000;
    for(int i=0;i<nrElemente;++i) fout<<sol[i]<<" ";
    return 0;
}