#include <cstdio>
#include <cstring>
using namespace std;
int q;
int n;
int nn;
int l[205];
int r[205];
int no[205];
int dp[105];
char t[105];
int last[105];
char s[15][15];
inline void input(int &x){
x=0;char c=getchar();
while((c<'0'||c>'9')&&c!='-') c=getchar();
int p=1;if (c=='-') p=-1,c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-'0',c=getchar();x*=p;
}
inline int min(int a,int b){
return a<b?a:b;
}
int main(){
input(q);
while(q--){
scanf("%s",t+1);
input(n);
for (int i=1;i<=n;i++){
scanf("%s",s[i]+1);
}
memset(dp,0x3f,sizeof(dp));
memset(last,0,sizeof(last));
dp[0]=0;nn=0;
int len=strlen(t+1);
for (int i=1;i<=len;i++){
// printf("%d:\n",i);
for (int j=1;j<=n;j++){
bool ok=true;
int m=strlen(s[j]+1),k;
for (k=1;k<=m;k++){
if (t[i+k-1]!=s[j][k]){
// printf("%d\n",k);
ok=false;
break;
}
}
if (ok){
// printf("%d %d\n",i,i+m-1);
// printf("%d\n",j);
l[++nn]=i;
r[nn]=i+m-1;
printf("%d:%d %d\n",nn,l[nn],r[nn]);
no[nn]=j;
}
}
}
for (int i=1;i<=nn;i++){
printf("%d:%d %d\n",i,l[i],r[i]);
}
for (int i=1;i<=len;i++){
for (int j=1;j<=nn;j++){
if (l[j]<=i&&i<=r[j]){
if (dp[l[j]-1]+1<dp[i]){
dp[i]=dp[l[j]-1]+1;
last[i]=j;
}
}
}
}
if (dp[len]==0x3f3f3f3f) dp[len]=-1;
printf("%d\n",dp[len]);
if (dp[len]!=-1){
int now=last[len];
while(true){
printf("%d %d\n",no[now],l[now]);
now=last[l[now]-1];
if (!now) break;
}
}
}
return 0;
}
ILE on #6
在 line 53 和 line 59 输出的 l 和 r 竟然不一样/jk/jk/jk
求调