zoj 1315 Excuses, Excuses!

题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1315

题解 :   1  一个很简单的题 没有什么算法在里面,完全考输入输出,基本功  。

             2  很奇怪  每个案例后面总是输出一个空行,和一般的要求不一样 

             3 每次在调用cin.getline() 时 先用调用一次,吃掉前面cin没有管的回车换行符

             4 判断某一个关键词在不在这个借口中时,将这个关键词一步步的移动,逐一去匹配,还要注意的是,即便匹配成功,这个关键词前面和后面不可以有字母,所以还要对匹配成功的地址进行特判。

#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;

string tolowercase(string s)
{

   int size=s.length();
   for(int i=0;i<size;i++)
     if(s[i]>='A'&&s[i]<='Z')   s[i]=s[i]+32;

   return  s;
}
int main()
{
  //ifstream cin("testdata.txt");
    int k,e;
    int tag=0;
//    bool first=true;
    while(cin>>k>>e)
    {
       tag++;
//
//      if(first==false)  cout<<endl;
//      if(first==true)  first=false;

      string  * key=new string[k];
      for(int i=0;i<k;i++)
        cin>>key[i];


      string * excuse=new string[e];

      string * oriexcuse=new string[e];

      int *keynum=new  int [e];

      for(int i=0;i<e;i++)
          keynum[i]=0;

      char tempstring[75];

       //getchar();     // 吸收一个回车
        cin.getline(tempstring,75);
      for(int i=0;i<e;i++)
        {
          cin.getline(tempstring,75);
          oriexcuse[i]=tempstring;
          excuse[i]=tempstring;
          excuse[i]=tolowercase(excuse[i]);     //完成小写化

        }


     for(int j=0;j<e;j++)    //  对第j条借口 统计 出现了几个key
     {
        string curexcuse=excuse[j];


        int count=0;
       for(int i=0;i<k;i++)
        {
            string keyword=key[i];
            int size=keyword.length();

            for(int k=0;k+size-1<curexcuse.length();k++)
            {
                 string subexcuse=curexcuse.substr(k,size);
                 if(subexcuse==keyword)
                 {
                      if(k==0)
                      {
                         char ch=curexcuse[k+size];

                         if(ch<'a'||ch>'z')   count++;
                      }
                      else if(k==curexcuse.length()-size)
                      {
                          char ch=curexcuse[k-1];

                         if(ch<'a'||ch>'z')   count++;

                      }

                      else
                      {

                         char ch=curexcuse[k-1];

                         char ch2=curexcuse[k+size];
                         if((ch<'a'||ch>'z')&& (ch2<'a'||ch2>'z'))  count++;


                      }

                 }
            }

        }


       keynum[j]=count;

     }




       int maxnum=keynum[0];
      for(int i=0;i<e;i++)
         if(keynum[i]>maxnum)  maxnum=keynum[i];



       cout<<"Excuse Set #"<<tag<<endl;
       for(int i=0;i<e;i++)
         if(keynum[i]==maxnum)  cout<<oriexcuse[i]<<endl;

     cout<<endl;
    }
}


posted @ 2013-07-27 02:31  814jingqi  阅读(114)  评论(0编辑  收藏  举报