Cod sursa(job #2480894)

Utilizator elenaisaiaElena Isaia elenaisaia Data 26 octombrie 2019 10:56:57
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <vector>
#define ceva 2000003

using namespace std;

char a[ceva],b[ceva];
int n,m,pref[ceva],nr;
vector<int>sol;

void citire()
{
    a[0]=b[0]='*';
    ifstream fin("strmatch.in");
    fin>>a+1>>b+1;
    n=strlen(a+1);
    m=strlen(b+1); cout<<n<<" "<<m<<"\n"; cout<<a<<"\n"<<b<<"\n";
}

void prefix()
{
    pref[1]=0;
    for(int i=2;i<=n;i++)
    {
        int j=i-1;
        while(j)
        {
            if(a[i]==a[pref[j]+1])
            {
                pref[i]=pref[j]+1;
                break;
            }
            j=pref[j-1];
        }
    }
    for(int i=0;i<=n;i++)
        cout<<pref[i]<<" ";
    cout<<"\n";
}

void kmp()
{
    int nrc=1;
    for(int i=1;i<=m;i++)
    {
        if(b[i]==a[nrc])
        {
            nrc++;
            if(nrc==n+1)
            {
                nrc=pref[n]+1;
                sol.push_back(i-n);
                nr++;
            }
        }
        else
        {
            nrc--;
            while(b[i]!=a[nrc+1]&&nrc>0)
                nrc=pref[nrc];
            if(b[i]==a[nrc+1])
                nrc+=2;
            else
                nrc=1;
        }
    }
    cout<<nr;
}

void afisare()
{
    ofstream fout("strmatch.out");
    fout<<nr<<"\n";
    if(nr>1000)
        nr=1000;
    for(int i=0;i<nr;i++)
        fout<<sol[i]<<" ";
}

int main()
{
    citire();
    prefix();
    kmp();
    afisare();
    return 0;
}