2007年百度之星程序设计大赛初赛题目——百度的高级搜索方法

题面描述:

你尝试过在百度上使用 site inurl 语法查询吗 ? 如果还没有的话可以试一下 :)

如输入 site:www.baidu.com inurl:news

 则会搜出所有在 www.baidu.com 站点上的包含 "news" 子串的 url 。

 现在我们有两份数据,一份是 site_inurl.txt 一份是 url.txt

site_inurl.txt 中每行是一个 site inurl 语法组成的查询串, url.txt 中保存的是 url 列表。

你能否在 url 列表中找出所有能被 site_inurl.txt 中的查询串检索到的 url?

如 site_inurl.txt 内容如下:

site:www.baidu.com inurl:/more  

site:zhidao.baidu.com inurl:/browse/

site:www.sina.com.cn inurl:www20041223am

url.txt 内容如下:  

http://www.baidu.com/more/

http://www.baidu.com/guding/more.html

http://www.baidu.com/events/20060105/photomore.html

http://hi.baidu.com/browse/

 http://hi.baidu.com/baidu/

http://www.sina.com.cn/head/www20021123am.shtml

http://www.sina.com.cn/head/www20041223am.shtml

则你的程序运行完输出的结果应该为:

http://www.baidu.com/more/

 http://www.baidu.com/guding/more.html

 http://www.sina.com.cn/head/www20041223am.shtml

 程序以命令行形式传入这两个文件名,第一个参数为 site_inurl 文件对应的文件名,第二个参数为 url 列表对应的文件名,程序的输出请输出到标准输出。

C++实现代码:

  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4. using std::string;
  5. using std::cin;
  6. using std::cout;
  7. using std::endl;
  8. using std::cerr;
  9. using std::ifstream;
  10. int main(int argc, char *argv[])
  11. {
  12.  string sitestring,
  13.   urlstring;
  14.  if(argc==3)
  15.  {
  16.   sitestring.assign(argv[1]);
  17.   urlstring.assign(argv[2]);
  18.   cout<<"Your site file is: "<<sitestring<<endl;
  19.   cout<<"Your url file is: "<<urlstring<<endl;
  20.  }
  21.  else
  22.  {
  23.   cerr<<"Please check your arguments!"<<endl;
  24.   return -1;
  25.  }
  26.  cout<<endl;
  27.  ifstream sitefile(argv[1]);
  28.  if(!sitefile)
  29.  {
  30.   cerr<<"Error: Can't open file "<<argv[1]<<endl;
  31.   return -1;
  32.  }
  33.  while(getline(sitefile,sitestring))
  34.  {
  35.   ifstream urlfile(argv[2]); 
  36.   if(!urlfile)
  37.   {
  38.   cerr<<"Error: Can't open file "<<argv[2]<<endl;
  39.   return -1;
  40.   }
  41.   string::size_type sitepos,
  42.    urlpos;
  43.   if((sitepos=sitestring.find("site:"))==string::npos || 
  44.    (urlpos=sitestring.find("inurl:"))==string::npos)
  45.    continue
  46.   cout<<sitestring<<endl;
  47.   string subsite=sitestring.substr(sitepos+5,urlpos-6);
  48.   string suburl=sitestring.substr(urlpos+6);
  49.   while(getline(urlfile,urlstring))
  50.   {
  51.    if((urlstring.find(subsite.c_str(),0,subsite.size()-1)!=string::npos) 
  52.     && (urlstring.find(suburl.c_str(),0,suburl.size()-1)!=string::npos))
  53.     cout<<urlstring<<endl;
  54.   }  
  55.   cout<<endl;
  56.  }
  57.  return 0;
  58. }

 

你可能感兴趣的:(2007年百度之星程序设计大赛初赛题目——百度的高级搜索方法)