Cod sursa(job #1815417)

Utilizator DobosDobos Paul Dobos Data 25 noiembrie 2016 10:53:20
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

#define NMAX 10005

using namespace std;

ifstream fin ("potrivire.in");
ofstream fout("potrivire.out");

int P[NMAX];
string A,B;

void prefix(int n){
    int q = 0;
    for(int i = 2; i <= n; i++){

        while(q && B[i] != B[q + 1] && B[i] != '*' && B[q + 1] != '*')
            q = P[q];
        if(B[i] == B[q + 1] || B[i] == '*' || B[q + 1] == '*' )
            q++;
        P[i] = q;
    }
}

int potrivire(int n,int m){
    int q = 0,k = 0;
    for(int i = 1; i <= n; i++){

       while(q && B[q + 1] != A[i] && B[q + 1] != '*')
            q = P[q];
       if(B[q + 1] == A[i] || B[q + 1] == '*'){
        while(A[i] != B[q + 1])
            i++;

       }
            k++;
       if(q == m){
            fout << i - m + 1 << " " << i ;
            return 1;

       }

    }

    return 0;

}

int main()
{
    ios :: sync_with_stdio(false);
    fin.tie(NULL);
    int n,m;

    fin >> n >> m;
    fin >> A >> B;

    A = "$" + A;
    B = "$" + B;
   // prefix(m);
    int p = 0;
    for(int i = 1; i <= m; i++)
    {
            if(!potrivire(n,m))
        fout << -1;
    }
        if(B[i] == '*')
            prefix(i,m);

    for(int i = 1;i <= m; i++){
        fout << P[i] << " ";
    }
    if(!potrivire(n,m))
        fout << -1;

    return 0;
}