记录编号 |
248416 |
评测结果 |
AAAAAAAA |
题目名称 |
[NOIP 2001]统计单词个数 |
最终得分 |
100 |
用户昵称 |
_Itachi |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.000 s |
提交时间 |
2016-04-10 14:21:18 |
内存使用 |
0.00 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#define fre freopen("tjdcgs.in","r",stdin);freopen("tjdcgs.out","w",stdout);
using namespace std;
int _rabit();void _run();
char c[205],dan[7][205];int sum[205][205],f[205][205],len[7];
int xx=_rabit();
int main(){;}
int _rabit(){
fre
int tim;scanf("%d",&tim);
while(tim--)_run();
}
void _run(){
int n,m,p;scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",c+i*20+1);
n*=20;scanf("%d",&p);
for(int i=1;i<=p;i++){
scanf("%s",dan[i]+1);
len[i]=strlen(dan[i]+1);
}
//cout<<c[12]<<' '<<c[13]<<endl;
for(int i=1;i<=n;i++){
for(int j=1;j<=p;j++)
if(c[i]==dan[j][1]){
bool f=0;
if(n<i+len[j]-1)f=1;
else for(int k=1;k<len[j];k++)
if(c[i+k]!=dan[j][1+k]){
f=1;break;
}
if(!f){
for(int s=i;s>0;s--)
for(int t=i+len[j]-1;t<=n;t++)
sum[s][t]++;
break;
}
}
}
//printf("%d %d %d ",sum[1][200],sum[1][197],sum[1][198]);
//for(int i=1;i<=n;i++)
//for(int j=1;j<=n;j++)
//printf("%d %d %d\n",i,j,sum[i][j]);
for(int jj,i=1;i<=n;i++){//前I个数
jj=i;if(jj>m)jj=m;
for(int j=1;j<=jj;j++)//多少划分
for(int k=j-1;k<i;k++)//断点
if(f[i][j]<f[k][j-1]+sum[k+1][i])
f[i][j]=f[k][j-1]+sum[k+1][i];
}
//if(f[n][m]==192)f[n][m]++;
printf("%d",f[n][m]);
}