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;
}

四:总结

字符串的题目如果能合理运用容器的知识能起到事半功倍的作用。

posted @ 2015-02-09 14:36  future_hero  阅读(304)  评论(0编辑  收藏  举报