记录编号 248448 评测结果 AAAAAAAA
题目名称 [NOIP 2001]统计单词个数 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2016-04-10 14:53:45 内存使用 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]);
}