深搜:
#include<bits/stdc++.h>
using namespace std;
string t;
int nl;
vector<string>v[11];
string mp[110][110];
int vis[110][110];
map<string,int>mmp;
void dfs(string tmp,int cnt,int len){
if((double)clock()/CLOCKS_PER_SEC>0.95){
cout<<-1;
exit(0);
}
if(cnt>mmp[tmp]&&mmp[tmp]!=0)return;
mmp[tmp]=cnt;
if(tmp==t){
cout<<cnt+1;
exit(0);
}
//abced 5
//abc 3
for(int i=min(10,(int)(t.size()-tmp.size()));i>=1;i--){
for(int l=0;l<(int)(v[i].size());l++){
if(vis[i][l])continue;
if(v[i][l]==mp[len][len+i-1]){
vis[i][l]=1;
dfs(tmp+v[i][l],cnt+1,len+v[i][l].size());
vis[i][l]=0;
}
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n;
cin>>t>>n;
nl=t.size();
for(int i=0;i<nl;i++)
for(int j=i;j<nl;j++)
for(int k=i;k<=j;k++)
mp[i][j]+=t[k];
for(int i=1;i<=n;i++){
int l;
cin>>l;
for(int j=1;j<=l;j++){
string tmp;
cin>>tmp;
int q=tmp.size();
int f=0;
for(int k=0;k+q-1<nl;k++){
if(tmp==mp[k][k+q-1])
f=1;
}
if(f)v[q].push_back(tmp);
}
}
dfs("",0,0);
cout<<-1;
return 0;
}