#include<map>
#include<cmath>
#include<cstdio>
#include<time.h>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int MAXN = 110;
bool mp[MAXN][MAXN][MAXN*10];
int lenT,t1,n,minn=1e18,a[MAXN],len[MAXN][MAXN],dis[MAXN];
string str[MAXN][MAXN],t;
void dfs(int k,int sum){
// if(t1-clock()==1900){
// printf("-1");
// exit(0);
// }
if(sum>minn) return;
if(sum>=dis[k]) return;
dis[k]=sum;
if(k>=lenT){
minn=min(minn,sum);
return;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=a[i];j++){
if(mp[i][j][k]){
dfs(k+len[i][j],sum+1);
}
}
}
}
signed main(){
t1=clock();
cin>>t;
lenT=t.length();
scanf("%lld",&n);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
for(int j=1;j<=a[i];j++){
cin>>str[i][j];
len[i][j]=str[i][j].length();
}
}
// for(int i=0;i<lenT;i++){
// for(int j=i;j<lenT;j++){
// mp[{t.substr(i,j-i+1),i}]=true;
// }
// }
for(int i=0;i<lenT;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=a[j];k++){
if(i+len[j][k]-1<lenT && t.substr(i,len[j][k])==str[j][k]){
mp[j][k][i]=true;
}
}
}
}
int ans=0;
dfs(0,0);
if(minn>=1e9) minn=-1;
printf("%lld",minn);
return 0;
}
感觉记忆化搜索和 dp 差不多多(
时间也很可以 (1∼4ms)
但就是错了(悲