Cod sursa(job #3202934)

Utilizator octavi26octavian octavi26 Data 12 februarie 2024 18:09:52
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>
#define N 1008
#define inf 2000000001

using namespace std;

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

int n, m;
char text[N], pattern[N];
int v[N];
int sol[N];
bool dp[N][N];

void Citire()
{
    fin >> text;
    m = strlen(text);
}

void KMP()
{
    int i, j;
    for( i=0; i<=n; i++ ) v[i] = 0;
    j = 0, i = 1;
    while( i <= n )
    {
        if( pattern[j] == pattern[i] )
        {
            v[i] = j + 1;
            i++;
            j++;
        }
        else{
            if( j == 0 ) {v[i] = 0; i++; continue;}
            j = v[j - 1];
        }
    }

    i = j = 0;
    while( text[i] )
    {
        if( text[i] == pattern[j] ) j++, i++;
        else{
            if( j == 0 ) {i++; continue;}
            j = v[j - 1];
        }

        if( j == n )
            dp[i - n][i - 1] = 1;
    }
}

void Rezolvare()
{
    int q;
    fin >> q;
    for( int i=1; i<=q; i++ )
    {
        fin >> pattern;
        n = strlen(pattern);
        KMP();
    }

    for( int i=1; i < m; i++ )
        for( int j=i; j < m; j++ )
            sol[j] = min( sol[i - 1] + (!dp[i][j])*(j - i + 1), sol[j] );
    fout << sol[m - 1];
}

void Initializare()
{
    int i, j;
    for( i=0; i<=m; i++ )
        for( j=0; j<=m; j++ )
            dp[i][j] = 0;
    for( i=1; i<=m; i++ )
        sol[i] = inf;
}

int main()
{
    int task;
    fin >> task;
    while( task-- )
    {
        Citire();
        Initializare();
        Rezolvare();
        fout << "\n";
    }
    return 0;
}