woj1414 – URL 解题报告

  原题目见:Problem 1414 – URL
  题目的背景是,我们在浏览器中输入URL时,浏览器会提示我们之前搜索过的,URL以当前字符为前缀的的网页,并且按照之前访问次数来递减显示。
  思路,每次Visit时将访问的页面作为KEY来保存,并且次数增1。每次Display时,搜索所有现存的网页,找到以当前字符串为前缀的字符串,并按次数逆序输出。
  虽然解题报告不提倡直接贴代码,不过我的代码没多少行,题目又比较简单,就给我AC的代码吧。这题的数据比较弱,我看前200多名都是0MS。代码是逼着自己用STL中的容器map写的,如果发现有什么改进的地方请告诉我。

#include <iostream>
#include <map>
#include <string>
 
using namespace std;
 
int main()
{
    string prompt,str;
    int n,m;
    string visit("Visit");
    //string display("Display");
    typedef map<string , int> Urls;
    typedef Urls::const_iterator UrlsIter;
 
    typedef multimap<int ,string , greater<int> > Urlrank;
    typedef Urlrank::const_iterator RankIter;
 
    Urls url;
    Urlrank urlrank;
 
    cin>>n;
 
    while( n-- ){
        cin>>m;
 
        url.clear();
        urlrank.clear();
 
        while( m--){
            cin >> prompt >> str;
 
            if ( visit.compare(prompt)==0){
                url[str]++;
            }else{
                for(UrlsIter iter = url.begin(); iter != url.end(); iter++ ){
                    string tmp(iter->first);
                    if ( tmp.find(str) == 0 ){
                        urlrank.insert( make_pair( iter->second,iter->first ) );
                    }
                }
 
                for( RankIter iter = urlrank.begin(); iter != urlrank.end(); iter++)
                    cout << iter->second <<endl;
 
                cout <<endl;
                urlrank.clear();
            }
        }
    }
    return 0;
}

One Comment

  1. Sandy said on: 2009年08月31日 12:50

    这缩进。。。。。。。。-_-||(突然发现你的表情里面居然没有汗。。)

    大概看了下,你的mulitMap完全可以用优先队列来替代,或者一个下标vector进行sort都会更快些。

    不过你那个遍历map的操作显然不是最好的方法。

    PS:visit.compare(prompt)==0这是太古老的C写法了,可以直接visit == prompt

    [回复]

    boluor 回复  于   

    缩进出现问题原来是我在CB中部分代码是用了TAB符号,部分是TAB用空格代替…现在好了。

    看到map和multimap,发现用这两个容器就可以实现了,就没去用vector排序和priority_queue了。我晚上用这两个写下。

    [回复]

Post a Comment

Your email is never published nor shared. Required fields are marked *

*

*

click to changeSecurity Code