天天看點

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