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

四:总结

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

时间: 2024-08-05 04:40:55

ZOJ 1315【Excuses, Excuses!】------2015年2月9日的相关文章

传智播客_2015年Java基础视频-深入浅出精华版 笔记(2015年9月14日23:11:11)

本笔记是个人笔记+摘录笔记相结合,非完全原创 day01 win 7系统打开DOS有趣方法:按住shift+右键,单击“在此处打开命令窗口”(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复?!! 常用DOS命令d: 回车 盘符切换dir(directory):列出当前目录下的文件以及文件夹md (make directory) : 创建目录(创建文件夹)rd (remove directory): 删除目录(删除文件夹,注意:前提是文件夹必须是空的!!)如果

2015年8月27日课程作业(文件权限管理及grep正则和扩展正则表达式)-JY1506402-19+liuhui880818

学习内容:文件权限管理及grep正则和扩展正则表达式 系统环境:CentOS 6.7/7 x86_64 一.作业(练习)内容: 1.总结本此课程中所涉及命令的使用方法及相关示例展示: 2.总结基本正则表达式及扩展正则表达式 3.显示/etc/passwd文件中以bash结尾的行 4.显示/etc/passwd文件中的两位数或三位数 5.显示`netstat -tan`命令结果中以'LISTEN'后跟0个.1个或者多个空白字符结尾的行 6.添加用户bash.testbash.basher以及nol

linux运维实战练习-2015年8月30日课程作业(练习)安排

一.作业(练习)内容: 1.总结文本编辑工具vim的使用方法: 2.总结文件查找命令find的使用方法: 3.总结bash环境变量的相关内容: 4.总结Linux文件系统上的特殊权限(SUID.SGID.Sticky)的知识点: 5.总结Linux磁盘管理.文件系统相关知识点及其相关命令的使用方法: 6.复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符: 7.复制/etc/rc.d/init.d/functions文件至/t

雷米 - 心理罪:暗河(2015年8月9日)

<心理罪:暗河> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:290千字阅读完成:2015年8月9日

雷米 - 心理罪:教化场(2015年8月8日)

<心理罪:教化场> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:270千字阅读完成:2015年8月8日

雷米 - 心理罪:城市之光(2015年8月11日)

<心理罪:城市之光> 作 者:雷米译 者:系 列:出 版:重庆出版社字 数:374千字阅读完成:2015年8月9日

阿西莫夫 - 神们自己(2015年6月23日)

<神们自己> 作 者:阿西莫夫译 者:崔正男系 列:出 版:江苏凤凰文艺出版社字 数:230千字阅读完成:2015年6月23日

李宁-2015年7月13日-个人文档

姓名 李宁 日期 2015年7月13日 主要工作及心得 由于我负责服务器端的编写工作,而各部分的客户端的操作都要与服务器端通信,所以在今天的调试中,我贯穿于各部分模块的调试和检测,主要负责在出现问题时查找问题所属是客户端还是服务器端,针对服务器端出现的问题进行查找和修改. 上午我们的工作重心在于服务器端连接数据库,由于连接数据库是我们的项目中的一个核心部分,如果无法连接数据库,所有工作将无法继续展开,在此项目之前,我们接触Java连接数据库只在网页程序中接触过,并没有接触过普通的Java项目连接

2015年7月13日 项目开发记录

日期 2015年7月13日 星期 星期一 位置 中蓝公寓蓝芳园D507 主要工作 1)         解决服务器端连接数据库的问题(寻找驱动.驱动放置的位置及相关问题) 2)         代码合并及调试 操作员代码部分调试 提供者代码部分调试 经理代码部分调试 遇到的问题 1)         服务器端无法连接上数据库 2)         调试过程中遇到各种问题,例如 3)         JAVA中的日期类和数据库中的日期类转化问题 4)         字符串和日期的转化 解决方法