Cod sursa(job #2084328)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 8 decembrie 2017 22:48:07
Problema Potrivirea sirurilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

char pattern[2000010], str[2000010];
int l[2000010], n, m, v[1005], x=0;

void citire()
{
    ifstream fin ("strmatch.in");
    fin.getline(pattern, 2000010);
    fin.getline(str, 2000010);
}

void creare()
{
    int i=1, j=0;
    l[0]=0;
    while(i<m)
        if(pattern[i]==pattern[j])
        {
            l[i]=j+1;
            i++,j++;
        }
        else if(j==0) l[i++]=0;
        else j=l[j-1];
}

void parcurgere()
{
    int i, j;
    i=j=0;
    while(i<n)
        if(str[i]==pattern[j])
        {
            i++,j++;
            if(j==m)
            {
                v[x++]=i-m;
                j=l[j-1];
                if (x==1000)
                    return;
            }
        }
        else if(j==0)i++;
        else j=l[j-1];
}

void afisare()
{
    ofstream fout("strmatch.out");
    fout << x << "\n";
    for (int i=0; i<x; i++)
        fout << v[i] << " ";
}

int main()
{
    citire();
    n=strlen(str);
    m=strlen(pattern);
    creare();
    parcurgere();
    afisare();
    return 0;
}