zoj 1315 Excuses, Excuses!
题目地址: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; } }