{"id":12,"date":"2019-02-23T14:00:52","date_gmt":"2019-02-23T06:00:52","guid":{"rendered":"https:\/\/blog.kaaass.net\/acm\/?p=12"},"modified":"2019-02-23T14:00:52","modified_gmt":"2019-02-23T06:00:52","slug":"uva-1597-searching-the-web","status":"publish","type":"post","link":"https:\/\/blog.kaaass.net\/acm\/2019\/02\/uva-1597-searching-the-web\/","title":{"rendered":"UVA 1597 Searching the Web"},"content":{"rendered":"<p>stl\u5e94\u7528\u3002\u7206\u641c\u867d\u7136\u80fd\u8fc7\uff0c\u4f46\u662f\u5176\u5b9e\u53ef\u4ee5\u6839\u636e\u8bcd\u5efa\u4e00\u4e2a\u7d22\u5f15\uff0c\u6211\u7528\u4e86pair&lt;int, int&gt;\u6765\u4ee3\u8868\u8bcd\u51fa\u73b0\u5728\u7b2c\u51e0\u7bc7\u6587\u7ae0\u7684\u7b2c\u51e0\u884c\u3002\u8fd9\u6837\u505a\u6709\u4e2a\u597d\u5904\u5c31\u662f\uff0c\u628apair&lt;int, int&gt;\u4e22\u8fdbset\uff0c\u81ea\u52a8\u5c31\u6309\u7167\u6587\u7ae0-\u884c\u7684\u987a\u5e8f\u6392\u597d\u4e86\u3002\u63a5\u4e0b\u6765\u53ea\u8981\u5224\u65ad\u7136\u540e\u6784\u5efa\u7b26\u5408\u6761\u4ef6\u7684\u6587\u7ae0set&lt;int&gt;\u5c31\u597d\uff08\u5224\u65ad\u6210\u529f\u65f6\u987a\u4fbf\uff09\uff0c\u53ef\u4ee5\u7528algorithm\u7684\u4ea4\u96c6\u5e76\u96c6\uff0c\u4e0d\u8fc7\u6211\u6ca1\u7528\u3002\u80fd\u6539\u8fdb\u7684\u5730\u65b9\u5176\u5b9e\u633a\u591a\u7684\uff0c\u4e0d\u8fc7\u8fd9\u6837\u5c31100ms\u6c34\u8fdbLeaderboard\u524d\u5341\u4e86\uff0c\u56e0\u5782\u4e1d\u6c40\u3002\u4ee5\u53casstream\u771f\u7684\u597d\u6162\uff0c\u53bb\u6389\u76f4\u63a5\u5feb20ms\u2026\u2026<\/p>\n<p><!--more--><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"c\" data-enlighter-title=\"\">#include &lt;iostream&gt;\r\n#include &lt;map&gt;\r\n#include &lt;vector&gt;\r\n#include &lt;set&gt;\r\n\r\nusing namespace std;\r\nmap&lt;string, vector&lt;pair&lt;int, int&gt;&gt;&gt; dict;\r\nvector&lt;vector&lt;string&gt;&gt; passages;\r\n\r\nint main() {\r\n    int n, cur, cnt = 0;\r\n    string line, word, key;\r\n    cin &gt;&gt; n; getline(cin, line);\r\n    cur = 0;\r\n    passages.push_back(vector&lt;string&gt;());\r\n    while (n) {\r\n        getline(cin, line);\r\n        if (line[0] == &#039;*&#039; &amp;&amp; line.size() == 10) {\r\n            if (++cur == n) break;\r\n            else {\r\n                cnt = 0;\r\n                passages.push_back(vector&lt;string&gt;());\r\n            }\r\n            continue;\r\n        }\r\n        word.clear(); line.push_back(&#039;\\n&#039;);\r\n        for (char c: line) {\r\n            if (&#039;a&#039; &lt;= c &amp;&amp; c &lt;= &#039;z&#039; || &#039;A&#039; &lt;= c &amp;&amp; c &lt;= &#039;Z&#039;) {\r\n                word.push_back(tolower(c));\r\n            } else if (word.size() &gt; 0) {\r\n                pair&lt;int, int&gt; term;\r\n                if (dict.count(word) == 0)\r\n                    dict[word] = vector&lt;pair&lt;int, int&gt;&gt;();\r\n                term.first = cur; term.second = cnt;\r\n                dict[word].push_back(term);\r\n                word.clear();\r\n            }\r\n        }\r\n        cnt++;\r\n        passages[cur].push_back(line);\r\n    }\r\n    cin &gt;&gt; n; getline(cin, line);\r\n    vector&lt;string&gt; expr;\r\n    bool hit = false;\r\n    set&lt;int&gt; found;\r\n    set&lt;pair&lt;int, int&gt;&gt; lines;\r\n    while (n--) {\r\n        getline(cin, line);\r\n        expr.clear(); hit = false; found.clear(); lines.clear();\r\n        int ls = 0, i = 0;\r\n        while(++i &lt;= line.size())\r\n            if (i == line.size() || line[i] == &#039; &#039;)\r\n                expr.push_back(line.substr(ls, i)), ls = i + 1;\r\n        key = expr.size() == 2? expr[1]: expr[0];\r\n        if (dict.count(key) &gt; 0) {\r\n            for (auto p: dict[key]) {\r\n                found.insert(p.first);\r\n                lines.insert(p);\r\n            }\r\n        }\r\n        if (expr.size() == 2) {\r\n            for (int i = 0; i &lt; passages.size(); i++) {\r\n                if (found.count(i) &gt; 0) continue;\r\n                if (hit) cout &lt;&lt; &quot;----------\\n&quot;;\r\n                for (auto l: passages[i]) cout &lt;&lt; l;\r\n                hit = true;\r\n            }\r\n        } else {\r\n            if (expr.size() == 3) {\r\n                if (expr[1][0] == &#039;A&#039;) {\r\n                    set&lt;int&gt; nfound;\r\n                    if (dict.count(expr[2]) &gt; 0) {\r\n                        for (auto p: dict[expr[2]])\r\n                            if (found.count(p.first) &gt; 0) {\r\n                                nfound.insert(p.first);\r\n                                lines.insert(p);\r\n                            }\r\n                    }\r\n                    found = nfound;\r\n                } else {\r\n                    if (dict.count(expr[2]) &gt; 0) {\r\n                        for (auto p: dict[expr[2]]) {\r\n                            found.insert(p.first);\r\n                            lines.insert(p);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            if (found.size() &gt; 0) {\r\n                int last = 0;\r\n                for (auto p: lines) {\r\n                    if (found.count(p.first) == 0) continue;\r\n                    if (hit &amp;&amp; p.first != last) cout &lt;&lt; &quot;----------\\n&quot;;\r\n                    cout &lt;&lt; passages[p.first][p.second];\r\n                    hit = true; last = p.first;\r\n                }\r\n            }\r\n        }\r\n        if (!hit) cout &lt;&lt; &quot;Sorry, I found nothing.\\n&quot;;\r\n        cout &lt;&lt; &quot;==========\\n&quot;;\r\n    }\r\n    return 0;\r\n}<\/pre>","protected":false},"excerpt":{"rendered":"<p>stl\u5e94\u7528\u3002\u7206\u641c\u867d\u7136\u80fd\u8fc7\uff0c\u4f46\u662f\u5176\u5b9e\u53ef\u4ee5\u6839\u636e\u8bcd\u5efa\u4e00\u4e2a\u7d22\u5f15\uff0c\u6211\u7528\u4e86pair&lt;int, int&gt;\u6765\u4ee3\u8868\u8bcd &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.kaaass.net\/acm\/2019\/02\/uva-1597-searching-the-web\/\" class=\"more-link\">\u7ee7\u7eed\u9605\u8bfb<span class=\"screen-reader-text\">\u201cUVA 1597 Searching the Web\u201d<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-12","post","type-post","status-publish","format-standard","hentry","category-3","entry"],"_links":{"self":[{"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/posts\/12","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/comments?post=12"}],"version-history":[{"count":0,"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/posts\/12\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/media?parent=12"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/categories?post=12"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kaaass.net\/acm\/wp-json\/wp\/v2\/tags?post=12"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}