ZOJ 1315【Excuses, Excuses!】------2015年2月9日
一:题目大意
输入数据m,n,其中m是代表关键字的个数(每个关键字是一个字符串(但无空格)),n表示接口的数目,每一个借口由可有空格的字符串组成。现在需要对所有的接口进行扫描,找出含有关键字最多的借口并输出(若有多个都输出且不需要注意顺序)。
二:题目分析
本题算法难度并不大,但关键是处理字符串的技巧。详细解释见具体代码。
三:AC代码
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; struct Info { string s; int n; }; bool comp(const Info&a,const Info&b) { return a.n>b.n; } int main() { Info info; int m,n; char ss[77]; string s,t; vector<string>v; vector<Info>vv; int line =0; int i,j,k; int p; while(cin>>m>>n) { v.clear(); vv.clear(); line++; for(i=0;i<m;i++) { cin>>ss; s=ss; v.push_back(ss); } cin.getline(ss,77);//这个语句很重要,起到忽略空行的作用,因为cin读入单项后,仍有一个回车符留在本行,这样由cin.getline()读入整行第一次读入的是个空行 for(i=0;i<n;i++) { cin.getline(ss,77); s=ss; for(j=0;j<s.size();j++) { if(s[j]>=65&&s[j]<=90) { s[j]+=32; } } info.n=0; for(j=0;j<v.size();j++)//对每一个关键字进行搜索 { for(k=0;k<s.size()-v[j].size();k++) { t=""; for(p=k;p<k+v[j].size();p++) { t=t+s[p]; } if(k==0&&v[j]==t&&(s[p]<'a'||s[p]>'z'))//匹配在借口开头处 { info.n++; } else if(v[j]==t&&(s[k-1]<'a'||s[k-1]>'z')&&(s[p]>'z'||s[p]<'a'))//匹配在中间位置 { info.n++; } } } info.s=ss; vv.push_back(info); } sort(vv.begin(),vv.end(),comp); cout<<"Excuse Set #"<<line<<endl; for(i=0;i<vv.size();i++) { if(i!=0&&vv[i-1].n>vv[i].n)//可能存在匹配数目相同的借口 { break; } else cout<<vv[i].s<<endl; } cout<<endl; } return 0; }
四:总结
字符串的题目如果能合理运用容器的知识能起到事半功倍的作用。