Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 160
#define setIO(s) freopen(s".in", "r" , stdin)
using namespace std;
int n,m;
char L[N],S[32][N];
int length[N],g[N][N][32][22],f[N][N],h[N];
int main()
{
int i,j,len;
// setIO("input");
scanf("%s%d",L+1,&m),n=strlen(L+1);
for(i=1;i<=m;++i)
{
scanf("%s",S[i]+1),length[i]=strlen(S[i]+1);
for(j=1;j<=n;++j)
{
if(L[j]==S[i][1])
{
g[j][j][i][1]=1;
if(length[i]==1) f[j][j]=1;
}
}
}
for(len=2;len<=n;++len)
{
int l,r,k;
for(l=1;(r=l+len-1)<=n;++l)
{
for(i=1;i<=m;++i)
{
for(j=1;j<=length[i];++j)
if(S[i][j]==L[r])
g[l][r][i][j]|=g[l][r-1][i][j-1];
}
for(i=1;i<=m;++i)
{
for(j=1;j<=length[i];++j)
for(k=l;k<r;++k)
if(g[l][k][i][j]&&f[k+1][r]) g[l][r][i][j]=1;
// g[l][r][i][j]|=(g[l][k][i][j] && f[k+1][r]);
}
for(i=1;i<=m;++i) f[l][r]|=g[l][r][i][length[i]];
}
}
for(i=1;i<=n;++i)
{
h[i]=h[i-1]+1;
for(j=1;j<=i;++j) if(f[j][i]) h[i]=min(h[i], h[j-1]);
}
printf("%d\n",h[n]);
return 0;
}