Cod sursa(job #2376463)

Utilizator DanielznaceniDaniel Danielznaceni Data 8 martie 2019 15:49:42
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <cstring>

#define lim  2000005

using namespace std;

ifstream in("strmatch.in");
ofstream out("strmatch.out");

char a[lim], b[lim];

int v[lim], n, m, cate=0;

void read()
{
    in.getline(a, lim);
    in.getline(b, lim);
    n=strlen(a);
    m=strlen(b);
}

void parcurgere_a()
{
    v[0]=0;
    int i=1, j=0;
    while(i<n)
    {
        if(a[i]==a[j])
        {
            v[i]=j+1;
            ++j;
        }
        else
        {
            while(j>0 && a[i]!=a[j])
                j=v[j-1];
            if(a[i]==a[j])
            {
                v[i]=j+1;
                ++j;
            }
            else
            {
                v[i]=0;
                j=0;
            }
        }
        ++i;
    }
}

void parcurgere_b()
{
    int i=0, j=0;
    while(i<m)
    {
        if(a[j]==b[i])
        {
            ++j;
        }
        else
        {
            j=v[j-1];
        }
        if(j==n && cate<=1000)
        {
            out<<i-n+1<<" ";
            ++cate;
            j=v[j-1];
        }
        ++i;
    }
}
int main()
{
    read();
    parcurgere_a();/*
    for(int i=0; i<n; ++i)
        cout<<v[i]<<" ";*/
    parcurgere_b();
    return 0;
}