Pagini recente » Cod sursa (job #378591) | Cod sursa (job #2366942) | Cod sursa (job #2547601) | Cod sursa (job #371533) | Cod sursa (job #3202934)
#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;
}