天天看点

【jzoj2403】【2012.02.25普及组】单词(word)

题目描述

FJ想计算他的N(1<=N<=1000)只奶牛的名字的好听度,每个奶牛的名字是一个长度不超过1000的英文字母串。他创建了一个好名字的集合,数量为M(1<=M<=100),每个好名字的长度不超过30,奶牛的名字中每包含一个好名字(“包含”不一定要求连续),那么它的好听度就加1。所有的名字都不区分大小写,如名字“Bessie”包含“Be”、“sI”、“EE”、“Es”,但是不包含“eB”。

现在请你帮FJ计算每个奶牛名字的好听度。

输入

第1行: 2个用空格隔开的整数N 和 M;

第2…N+1行: 第i+1行为第i个奶牛的名字;

第N+2…N+M+1行:第N+i+1行为第i个好名字。

输出

第1…N行:第i个数为第i头奶牛名字的好听度。

样例输入

5 3
Bessie
Jonathan
Montgomery
Alicia
Angola
se
nGo
Ont
           

样例输出

1
1
2
0
1
           

提示

输入说明:FJ有5头奶牛,名字依次为"Bessie", “Jonathan”,“Montgomery”, Alicia"和"Angola",有3个好名字分别为"se","nGo"和 “Ont”.

输出说明: “Bessie” 包含 “se”, “Jonathan"包含"Ont”, "Montgomery"包含 “nGo” 、“Ont”,”Alicia“不包含任何好名字,“Angola"包含"nGo”.

解题思路

暴力对比,三个for:第一层枚举奶牛名字,第二层枚举好名字,第三层比较奶牛名字里有没有好名字

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int n,m,Gun;
string a[2000],b[200];
int main(){
	freopen("word.in","r",stdin);
	freopen("word.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		for(int j=0;j<a[i].size();j++)
		    if(a[i][j]<='Z')
		       a[i][j]=(char)((int)(a[i][j])+32);
	}
	for(int i=1;i<=m;i++){
	    cin>>b[i];
	    for(int j=0;j<b[i].size();j++)
		    if(b[i][j]<='Z')
		       b[i][j]=(char)((int)(b[i][j])+32);
	}
	//因为不分大小写,所以把字符都转换成小写(,或大写)
	for(int i=1;i<=n;i++){
		Gun=0;
	    for(int j=1;j<=m;j++)
	    	for(int k=0,l=0;k<=a[i].size();k++){
	    	//l是好名字,k是奶牛名字
	    		if(a[i][k]==b[j][l])
	    		   l++;//符合题目的不连续也可以
	    		if(l>=b[j].size()){
	    	       Gun++;break;
	    	       //表示已经比对完了一个好名字,答案增加1
				}
			}
		printf("%d\n",Gun);
	}
}
           

继续阅读