Cod sursa(job #1886970)

Utilizator DobosDobos Paul Dobos Data 21 februarie 2017 11:50:21
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <bits/stdc++.h>
#define NMAX 1005
#define CMAX 3005

using namespace std;

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

int M[CMAX][NMAX],P[CMAX];

string S,D;

void kmp(){

    int q = 0;

    for(int i = 2; i < D.size(); i++){

        while(q && D[q + 1] != D[i])
            q = P[q];
        if(D[q + 1] == D[i])
            q++;
        P[i] = q;

    }

}

int main()
{
    ios :: sync_with_stdio(false);

   int T,n;

   fin >> T;

   while(T--){

    fin >> S >> n;

    S = '$' + S;

    for(int j = 1; j <= n; j++){
        fin >> D;
        D = '$' + D;
        kmp();
        int q = 0,m = D.size() - 1;


        for(int i = 1; i < S.size(); i++){
            while(q && S[i] == D[q + 1])
                q = P[q];
            if(S[i] == D[q + 1])
                q++;
            if(q == m)
                M[i][j] = 1;

        }

    }

    for(int i = 1; i < S.size(); i++){
        for(int j = 1; j <= n; j++)
            fout << M[i][j] << " ";

        fout << "\n";
        }



   }

    return 0;
}