Cod sursa(job #2909960)

Utilizator mariusn01Marius Nicoli mariusn01 Data 17 iunie 2022 11:45:31
Problema Potrivirea sirurilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#include <cstring>
#define DIM 2000000
using namespace std;
ifstream fin ("strmatch.in");
ofstream fout("strmatch.out");
char A[DIM+2], B[DIM+2];
int P[DIM+2], sol[1001];
int a, b, i, L, nr;
int main () {
    fin>>A+1;
    fin>>B+1;
    a = strlen(A+1);
    b = strlen(B+1);
    /// Pentru fiecare i pozitie din A calculam
    /// P[i] = lungimea maxima a unui prefix din A care este si sufix care se
    /// termina pe pozitia i (in afara cazului trivial al sufixului de lungime i)

    L = 0;  /// L = lungimea prefixului calculat pentru pozitia anterioara
            /// si pe care il actualizam pentru pozitia curenta
    for (int i=2;i<=a;i++) {
        while (L!=0 && A[i] != A[L+1])
            L = P[L];
        if (A[i] == A[L+1])
            L++;
        P[i] = L;
    }

    /// acum facem o procesare asemanatoare pe sirul in care cautam
    /// si la o anume pozitie i cautam lungimea maxima a unui
    /// sufix terminat in B la pozitia i si care este prefix in A
    /// cand gasim astfel de lungimi egale cu a avem potrivire.

    L = 0;
    for (i=1;i<=b;i++) {
        while (L != 0 && B[i]!=A[L+1])
            L = P[L];
        if (B[i] == A[L+1])
            L++;
        if (L == a) {
            nr++;
            if (nr<=1000)
                sol[nr] = i-a;
            L = P[L];
        }
    }
    fout<<nr<<"\n";
    for (int i=1;i<=min(1000, nr); i++)
        fout<<sol[i]<<" ";
    return 0;
}