题目链接:http://acm.whu.edu.cn/learn/problem/detail?problem_id=1049
//dp[i]表示以i结尾最少可以由多少个单词构成,如果单词j是i的后缀,
//那么dp[i]=min(dp[i],dp[i-length(word[j])]+1);
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
bool is_houzui(char *s,char *a,int i)
{
int ii,jj;
for(ii=i,jj=strlen(a)-1;jj>=0;ii--,jj--)
{
if(s[ii]!=a[jj]) break;
}
if(jj<0) return true;
else return false;
}
int main()
{
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int ncase,n,i,j;
char s[257],a[101][257];
cin>>ncase;
while(ncase--)
{
getchar();
cin>>s;
cin>>n;
getchar();
for(i=0;i<n;i++) cin>>a[i];
int dp[256];
dp[0]=0;
for(i=0;i<strlen(s);i++)
{
dp[i+1]=dp[i]+1;
for(j=0;j<n;j++)//这里是整个程序最耗时的地方,没有想怎么优化
if(strlen(a[j])<=i+1)
if(is_houzui(s,a[j],i))
dp[i+1]=min(dp[i+1],dp[i-strlen(a[j])+1]+1);
//cout<<dp[i+1]<<endl;
}
cout<<dp[strlen(s)]<<endl;
}
return 0;
}