Cod sursa(job #2931800)

Utilizator ClotanPClotan Paul Ioan ClotanP Data 31 octombrie 2022 22:44:39
Problema Potrivirea sirurilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <string.h>
#include <vector>
using namespace std;
ifstream fin("strmatch.in");
ofstream fout("strmatch.out");
///lps-longest prefix sufix

int pozMatch[1000];
int k;
int appeareance_Nr;
void computeLPSArray(string pat,int M,int *lps){
    int len = 0; /// length of the previous prefix suffix;

    lps[0] = 0; ///lps[0] is always 0

    ///now we compute lps[i] for i=1,m
    int i = 1;
    while(i < M){
        if(pat[i] == pat[len]){
            len++;
            lps[i] = len;
            i++;
        }
        else{
            if(len != 0)
                len = lps[len-1];
            else
            {
                lps[i] = 0;
                i++;
            }
        }
    }
}

void KPMSearch(string pat,string txt){
    int M = pat.length();
    int N = txt.length();
    int lps[M];

    computeLPSArray(pat,M,lps);

    int i = 0; ///index for txt[]
    int j = 0;///index for pat[]

    while( (N-i) >= (M-j) ){
        if(pat[j] == txt[i]){
            i++;j++;
        }

        if( j == M ){
            pozMatch[k++] = i-j;
            appeareance_Nr++;
            j = lps[j-1];
        }
        else
            if(i < N && pat[j] != txt[i])
                if(j != 0){
                    j = lps[j-1];
                }
                else
                    i++;
    }
}

int main()
{
    string pat;
    string txt;
    fin>> pat;
    fin>> txt;
    cout<<pat<<endl<<txt;
    KPMSearch(pat,txt);
    cout<<endl<<"hehe";
    cout<<endl<<appeareance_Nr;
    fout<<appeareance_Nr<<"\n";
    for(int i = 0;i < k; i++){
        fout<< pozMatch[i]<<" ";
    }
    return 0;
}