zoukankan      html  css  js  c++  java
  • 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;
    }

    四:总结

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

  • 相关阅读:
    sort()
    type()
    reverse()
    pop()
    remove()
    max()
    len()
    Ext.Js核心函数( 三)
    聚簇索引和非聚簇索引区别
    Ext.js入门(二)
  • 原文地址:https://www.cnblogs.com/khbcsu/p/4281529.html
Copyright © 2011-2022 走看看