/*
Migrated from Lutece 158 论文搜索
Description
allenlowesy突然从Marswind那里得知,光纤技术要结课了,期末考试内容是一篇论文。
allenlowesy以为可以不动脑筋地水过去,但是那位他从来没有见过的老师却规定,论文字数不得少于2000字,
更要命的是,参考文献必须是IEEE或者CSA的论文。
众所周知,IEEE上有很多很多很多很多论文。当allenlowesy打开IEEE的搜索界面寻找关键词为fiber的论文时,系统返回给他一大堆结果。
allenlowesy纠结了,他不可能把所有的论文都看了来确定是否有用。于是他假设,如果论文的标题中有一个单词是关键词(大小写也要一致),那么这篇论文是有用的。
现在allenlowesy需要从搜索结果中找到这些他认为有用的论文,那么这些论文有多少呢?
Input
含多组测试数据,输入首先是一个整数T表示测试数据组数(T≤20)。
每组数据开始为一个整数N(N≤100),表示检索到的论文数
接下来1行是allenlowesy搜索的关键词,长度不超过
20,只包括小写字母和大写字母。
接下来N行,每一行是一个论文的标题,长度不超过100,只包括小写字母、大写字母和空格
Output
每组数据输出一个整数M,表示allenlowesy认为有用的论文数。 如果没有一篇论文的标题包含有关键词,则输出Do not find。
在每组输出结果后再输出一个空行。
*/
#include <iostream>
#include <string>
bool isEmptyChar(char c){
return c==' '||c=='\t'||c=='\n';
}
void solve(){
int paperCount;std::cin>>paperCount;
std::string keyword;std::cin>>keyword;
//当使用std::cin>>读取数据后,输入流还可能包含换行符,此时如果使用std::getline()读取数据,会获取一个空字符串
//所以在读取数据前,应该先使用std::cin.ignore()清除输入流中的换行符
std::cin.ignore();
//std::cin.ignore()函数用于清除输入流中的字符,它会清除输入流中的一个字符,直到遇到换行符
int usefulPaperNum = 0;
for(int i = 0;i<paperCount;++i){
std::string paperTitle;
std::getline(std::cin,paperTitle);
//std::getline()获取输入流中的一整行文本,直到遇到换行符位置
//它会处理末尾的换行符,但不会将换行符放入字符串中(换行符被从输入流中移除)
auto pos = paperTitle.find(keyword);//函数返回std::string::size_type类型的值,表示子字符串在字符串中的位置
//如果没有找到子字符串,则返回std::string::npos,这个常量的类型也是std::string::size_type
//使用while循环, 在第一个匹配不是独立单词的情况下继续查找是否还有匹配的子字符串
//直到确认所有匹配的子字符串都不是独立单词, 或者找到一个是独立单词的子字符串的情况下才结束
while(pos!=std::string::npos){
bool flag = true;
if(pos!=0 && !isEmptyChar(paperTitle[pos-1])){
flag = false;
}else if((pos+keyword.size())<paperTitle.size() && !isEmptyChar(paperTitle[pos+keyword.size()])){
flag = false;
}
if(flag){
++usefulPaperNum;
break;
}else{
pos = paperTitle.find(keyword,pos+1);
}
}
}
if(usefulPaperNum==0){
std::cout<<"Do not find"<<std::endl;
}else{
std::cout<<usefulPaperNum<<std::endl;
}
std::cout<<std::endl;
}
int main(){
int T;std::cin>>T;
while(T--){
solve();
}
}