码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 1315【Excuses, Excuses!】------2015年2月9日

时间:2015-02-09 15:31:42      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:

一:题目大意

输入数据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;
}

四:总结

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

ZOJ 1315【Excuses, Excuses!】------2015年2月9日

标签:

原文地址:http://www.cnblogs.com/khbcsu/p/4281529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!