题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1315
题解 : 1 一个很简单的题 没有什么算法在里面,完全考输入输出,基本功 。
2 很奇怪 每个案例后面总是输出一个空行,和一般的要求不一样
3 每次在调用cin.getline() 时 先用调用一次,吃掉前面cin没有管的回车换行符
4 判断某一个关键词在不在这个借口中时,将这个关键词一步步的移动,逐一去匹配,还要注意的是,即便匹配成功,这个关键词前面和后面不可以有字母,所以还要对匹配成功的地址进行特判。
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;
string tolowercase(string s)
{
int size=s.length();
for(int i=0;i<size;i++)
if(s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32;
return s;
}
int main()
{
//ifstream cin("testdata.txt");
int k,e;
int tag=0;
// bool first=true;
while(cin>>k>>e)
{
tag++;
//
// if(first==false) cout<<endl;
// if(first==true) first=false;
string * key=new string[k];
for(int i=0;i<k;i++)
cin>>key[i];
string * excuse=new string[e];
string * oriexcuse=new string[e];
int *keynum=new int [e];
for(int i=0;i<e;i++)
keynum[i]=0;
char tempstring[75];
//getchar(); // 吸收一个回车
cin.getline(tempstring,75);
for(int i=0;i<e;i++)
{
cin.getline(tempstring,75);
oriexcuse[i]=tempstring;
excuse[i]=tempstring;
excuse[i]=tolowercase(excuse[i]); //完成小写化
}
for(int j=0;j<e;j++) // 对第j条借口 统计 出现了几个key
{
string curexcuse=excuse[j];
int count=0;
for(int i=0;i<k;i++)
{
string keyword=key[i];
int size=keyword.length();
for(int k=0;k+size-1<curexcuse.length();k++)
{
string subexcuse=curexcuse.substr(k,size);
if(subexcuse==keyword)
{
if(k==0)
{
char ch=curexcuse[k+size];
if(ch<'a'||ch>'z') count++;
}
else if(k==curexcuse.length()-size)
{
char ch=curexcuse[k-1];
if(ch<'a'||ch>'z') count++;
}
else
{
char ch=curexcuse[k-1];
char ch2=curexcuse[k+size];
if((ch<'a'||ch>'z')&& (ch2<'a'||ch2>'z')) count++;
}
}
}
}
keynum[j]=count;
}
int maxnum=keynum[0];
for(int i=0;i<e;i++)
if(keynum[i]>maxnum) maxnum=keynum[i];
cout<<"Excuse Set #"<<tag<<endl;
for(int i=0;i<e;i++)
if(keynum[i]==maxnum) cout<<oriexcuse[i]<<endl;
cout<<endl;
}
}