<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom"><id>https://blog.tusooa.xyz</id><title>无奈 - 何事西风不待人</title><link href="https://blog.tusooa.xyz"/><subtitle>迷糊萝莉</subtitle><updated>2026-07-09T19:00:00.000Z</updated><entry><id>https://blog.tusooa.xyz/2026/07/09/Stop-crawling-my-code-repositories/</id><title>Stop crawling my code repositories</title><link rel="alternate" href="https://blog.tusooa.xyz/2026/07/09/Stop-crawling-my-code-repositories/"/><published>2026-07-09T19:00:00.000Z</published><content type="html">&lt;p&gt;I don&apos;t know if it&apos;s related to the prevalence of language-model-based automation tools, but for the past few years, I have been seeing logs of page loads of blame pages and file-at-commit pages for my code repositories at &lt;a href=&quot;https://r.lily-is.land&quot;&gt;Forgejo&lt;/a&gt; and &lt;a href=&quot;https://iron.lily-is.land&quot;&gt;Phorge&lt;/a&gt;. Their IP was randomly distributed, and the rate goes up to 10 requests per second. This does not look normal for our small site, and it made the load average of the server hike up to 40 (!).&lt;/p&gt;
&lt;a&gt;&lt;/a&gt;
&lt;p&gt;For Forgejo, the main problem is it invokes git every time it receives such request, and that git command is very costly. For Phorge, the main cost is invoking the pygmentize code highlighter.&lt;/p&gt;
&lt;p&gt;So I decided to rate-limit the requests. I started with 5 requests per second limit, and paired that with fail2ban. The load went down, but it wasn&apos;t enough for us to maintain the stability of the server. Normal requests still took unreasonable time and it could time out at any moment. So I set the rate-limit to a more aggressive 1 request per second. Good enough for some time, but still problematic, as the rate-limit often unnecessarily hurts the experience of legit users like myself, and I have seen myself banned by fail2ban because I was the only one requested twice in a row with the same IP. Crawlers, on the other hand, always use hundreds of thousands of different IPs.&lt;/p&gt;
&lt;p&gt;So this needs to end. One way to do it is to let logged-in users view the pages as usual while keeping out non-logged-in crawlers.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You probably want to interject for a moment, saying &quot;Why not proof of work?&quot;
And the answer is, I really hate the idea of using a machine to check whether
someone is human. So things like Anubis or Go Away is none of interest for me.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And I let the shit generator to generate such a config for me. The idea is to use the session cookie: ask the reverse proxy to access a page that requires authentication, but is much less costly than rendering the file-at-commit and blame pages.&lt;/p&gt;
&lt;p&gt;For Forgejo, the page could be &lt;code&gt;/user/settings&lt;/code&gt;. It will return 200 if the user is logged in, but non-logged-in users will get a &lt;code&gt;303&lt;/code&gt; redirect to the login page. The result is the nginx configuration below:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;  location = /_auth {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    internal;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_method HEAD;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass http://forgejo/user/settings;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass_request_body off;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Content-Length &quot;&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Host r.lily-is.land;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Cookie $http_cookie;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_intercept_errors on;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    error_page 301 302 303 307 =401 /_auth_fail;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  location @login_redirect {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    add_header Content-Type text/html always;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return 401 &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Unauthorized&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Due to spam, we have limited file at commit and blame pages to logged-in users. Please &amp;lt;a href=&apos;https://r.lily-is.land/user/login&apos;&amp;gt;login&amp;lt;/a&amp;gt;.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  location ~ ^/[^/]+/[^/]+/(src|commits|raw|blame)/commit {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    auth_request /_auth;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    error_page 401 = @login_redirect;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass http://forgejo;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Connection $http_connection;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Upgrade $http_upgrade;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Host $host;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For Phorge, the problem is a little bit more tricky, because I cannot find something that return 2xx if and only if the user is logged in. Quite the opposite, many pages, like the settings page, return 200 if and only if the user is &lt;strong&gt;not&lt;/strong&gt; logged in. So I went on with composing another mini-server that analyze the result and convert the status code to my needs.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#!/usr/bin/env python3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; http.server, urllib.request&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;PHORGE&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &quot;http://......&quot;&lt;/span&gt;&lt;span&gt; # intranet address of phorge instance&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;PHORGE_HOST&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &quot;iron.lily-is.land&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;class&lt;/span&gt;&lt;span&gt; Handler&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;server&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;BaseHTTPRequestHandler&lt;/span&gt;&lt;span&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    def&lt;/span&gt;&lt;span&gt; do_GET&lt;/span&gt;&lt;span&gt;(self):&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        cookie &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt;.headers.get(&lt;/span&gt;&lt;span&gt;&quot;Cookie&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        req &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; urllib.request.Request(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;{PHORGE}&lt;/span&gt;&lt;span&gt;/settings/&quot;&lt;/span&gt;&lt;span&gt;, method&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;HEAD&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        req.add_header(&lt;/span&gt;&lt;span&gt;&quot;Host&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;PHORGE_HOST&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        req.add_header(&lt;/span&gt;&lt;span&gt;&quot;Cookie&quot;&lt;/span&gt;&lt;span&gt;, cookie)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        try&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            resp &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; urllib.request.urlopen(req)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Response:&apos;&lt;/span&gt;&lt;span&gt;, resp)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            self&lt;/span&gt;&lt;span&gt;.send_response(&lt;/span&gt;&lt;span&gt;200&lt;/span&gt;&lt;span&gt; if&lt;/span&gt;&lt;span&gt; resp.url.startswith(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;https://&lt;/span&gt;&lt;span&gt;{PHORGE_HOST}&lt;/span&gt;&lt;span&gt;/settings/user/&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; 401&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        except&lt;/span&gt;&lt;span&gt; Exception&lt;/span&gt;&lt;span&gt; as&lt;/span&gt;&lt;span&gt; e:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;Exception:&apos;&lt;/span&gt;&lt;span&gt;, e)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            self&lt;/span&gt;&lt;span&gt;.send_response(&lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        self&lt;/span&gt;&lt;span&gt;.end_headers()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;http.server.HTTPServer((&lt;/span&gt;&lt;span&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;9090&lt;/span&gt;&lt;span&gt;), Handler).serve_forever()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The reasoning is as follows: When accessing &lt;code&gt;HEAD /settings/&lt;/code&gt;, if the session cookie is valid for a logged-in user, it redirects to &lt;code&gt;&amp;lt;Public-Address&amp;gt;/settings/user/&amp;lt;Username&amp;gt;/&lt;/code&gt;, otherwise it, well, it can behave in a couple of ways, like returning 200 (with a login form if it is a GET request) or 500 (why?). It is worth notice that the session cookie has &lt;code&gt;phusr=&amp;lt;Username&amp;gt;&lt;/code&gt;, and I tried requesting the endpoint with a bad cookie like &lt;code&gt;phsid=xxx; phusr=tusooa&lt;/code&gt; (where xxx is a valid session id but with one letter different, because Phorge tends to check length and format before actual checks!), and it will not make the redirect to &lt;code&gt;/settings/user/tusooa/&lt;/code&gt;, so this method is safe.&lt;/p&gt;
&lt;p&gt;And the nginx configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;  location = /_phorge_auth {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    internal;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass http://logincheckserver/; # Must have trailing slash, otherwise it requests GET /_phorge_auth instead of GET /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass_request_body off;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Cookie $http_cookie;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Content-Length &quot;&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  location ~ ^/diffusion/[^/]+/(history|browse) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    auth_request /_phorge_auth;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_pass http://phorge;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_redirect off;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header Host $http_host;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Real-IP $remote_addr;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Forwarded-Proto $scheme;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Forwarded-Protocol $scheme;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    proxy_set_header X-Url-Scheme $scheme;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    error_page 401 = @not_logged_in;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  location @not_logged_in {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    add_header Content-Type text/html always;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return 401 &quot;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Unauthorized&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;Due to spam, we have limited file at commit and blame pages to logged-in users. Please &amp;lt;a href=&apos;/auth/start/&apos;&amp;gt;login&amp;lt;/a&amp;gt;, use the &amp;lt;a href=&apos;https://r.lily-is.land/&apos;&amp;gt;Forgejo instance&amp;lt;/a&amp;gt;, or better yet, clone the repository for your local use.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&quot;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hopefully I can get rid of the crawlers soon. Last time I disabled these endpoints completely on Forgejo and returned 403 for them, the rate of crawler requests decreased significantly.&lt;/p&gt;</content></entry><entry><id>https://blog.tusooa.xyz/2020/10/01/Fix-firefox-address-bar-clickSelectsAll-bug/</id><title>Fix firefox address bar clickSelectsAll bug (Spoiler: no re-compilation required.)</title><link rel="alternate" href="https://blog.tusooa.xyz/2020/10/01/Fix-firefox-address-bar-clickSelectsAll-bug/"/><published>2020-10-01T20:15:56.000Z</published><updated>2026-05-29T12:00:00.000Z</updated><content type="html">&lt;p&gt;This is last updated 2026,5,29 (5) to reflect new changes for Firefox &amp;gt;= 201.
&lt;a href=&quot;https://r.lily-is.land/tusooa/tusooa.pg.kazv.moe/commits/branch/astro/astro/src/content/blog/Fix-firefox-address-bar-clickSelectsAll-bug.md&quot;&gt;View update history&lt;/a&gt;. This post has been updated 4 times to adapt
to upstream changes.&lt;/p&gt;
&lt;p&gt;A couple of months ago, I opened my Firefox as usual, I found out that
when I click on the address bar, it dared to select everything in it
as if any creepy browser would do! The first thing I did is to check
the &lt;code&gt;clickSelectsAll&lt;/code&gt; pref -- what I always do first after getting a
new install of Firefox on Windows is setting this pref to &lt;code&gt;false&lt;/code&gt;,
and setting &lt;code&gt;doubleClickSelectsAll&lt;/code&gt; pref to &lt;code&gt;true&lt;/code&gt;: that is the default
behaviour for Firefox on GNU/Linux... that time at least...&lt;/p&gt;
&lt;p&gt;Much to my disappointment, the pref are setting correctly, but nothing
works. I tried to search for this, but without success, maybe since
this bug was so new, or I was to silly to apply the right keywords
(huh, maybe the latter one?). So I created an account on Mozilla&apos;s
bugtracker just to open &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1629135&quot;&gt;a bug&lt;/a&gt;. At the same time I switched
back to the ESR version of Firefox, which rid me (till recently) of
this stupid address bar but still granted me security updates. A
few days ago, however, Firefox ESR was unfortunately eventually shipped
with this bug, calling for a solution.&lt;/p&gt;
&lt;a&gt;&lt;/a&gt;
&lt;h1&gt;&lt;a href=&quot;#Some-more-background&quot;&gt;Some more background&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Here I will add more background because I need to complain a lot (&amp;gt;w&amp;lt;).
If you would like to see the solution directly, &lt;a href=&quot;#The-solution&quot;&gt;jump there&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Someone on bugzilla pointed out that the bug had been
&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=1621570&quot;&gt;raised by someone else&lt;/a&gt;. Following that bug, I saw that
the developer was being pretty toxic and just marked it as &lt;code&gt;WONTFIX&lt;/code&gt;,
despite many people criticized the buggy behaviour and regarded
the original behaviour as signature of Firefox. I finally switched
from Ubuntu to Gentoo after the new ESR, as I would like to have more
control of my software.&lt;/p&gt;
&lt;p&gt;Yesterday I &lt;a href=&quot;https://matrix.to/#/!NREUQXSZzhWoQFQpTe:matrix.org/$16014845914171808dKKcm:matrix.org?via=matrix.org&amp;amp;via=tusooa.xyz&quot;&gt;talked&lt;/a&gt; to &lt;a href=&quot;https://outsideofinfinity.wordpress.com/&quot;&gt;tiar&lt;/a&gt; about the freedom
of users to make software behave the way they want, without necessarily
being a developer. I complained that many free/libre software does not
excel in this aspect, using Firefox &amp;gt;=75 as an example.&lt;/p&gt;
&lt;p&gt;The thing Firefox developers does, by removing the &lt;code&gt;clickSelectsAll&lt;/code&gt;
prefs, is actually somewhat limiting users&apos; freedom, as customization
becomes harder and harder. This kind of freedom has been brought up
by a KDE person as &lt;a href=&quot;https://phabricator.kde.org/T11091&quot;&gt;a goal&lt;/a&gt; called &quot;freedom out of the box.&quot;
In short, it aims to make changing the behaviour of a program
as easy as just using it, probably unifying the interface where a program
is used and where a program is customized.&lt;/p&gt;
&lt;p&gt;And that is reasonable: no one should have to spend quite a long time
reading an extraordinarily large code base just to make a tiny little
change that would significantly improve their lives. We will simply not
have that much time. I know tweaking system is fun... (should I say
addictive?) but still, instant result is always a good-to-have.&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;#The-solution&quot;&gt;The solution&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;For Firefox, we do have a &lt;a href=&quot;https://superuser.com/questions/540851/go-back-to-not-selecting-the-whole-url-when-i-click-the-address-bar&quot;&gt;solution&lt;/a&gt; without needing to
recompile. That is, to change the &lt;code&gt;omni.ja&lt;/code&gt; pack in the Firefox
distribution. Based on that I managed to restore the old good
urlbar behaviour.&lt;/p&gt;
&lt;p&gt;For my &lt;code&gt;firefox-bin&lt;/code&gt; on Gentoo, the relevant file is at
&lt;code&gt;/opt/firefox/browser/omni.ja&lt;/code&gt;. (In Firefox v146 with &lt;a href=&quot;https://phabricator.services.mozilla.com/D270553#change-373rnO3LTLeb&quot;&gt;https://phabricator.services.mozilla.com/D270553#change-373rnO3LTLeb&lt;/a&gt;, the file was once shortly in &lt;code&gt;omni.ja&lt;/code&gt; instead of &lt;code&gt;browser/omni.ja&lt;/code&gt;.)&lt;/p&gt;
&lt;p&gt;First make a copy of that file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; /opt/firefox/browser/omni.ja&lt;/span&gt;&lt;span&gt; omni.ja.orig&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then unzip the file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; omni&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; omni&lt;/span&gt;&lt;span&gt; /opt/firefox/browser/omni.ja&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It may return 2, but does not matter.&lt;/p&gt;
&lt;p&gt;Then edit the &lt;code&gt;chrome/browser/content/browser/urlbar/UrlbarInput.mjs&lt;/code&gt;. In the &lt;code&gt;_on_mousedown&lt;/code&gt; function:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Change&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;#preventClickSelectsAll&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;focused&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;#preventClickSelectsAll&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to get the (no) &lt;code&gt;clickSelectsAll&lt;/code&gt; behaviour.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Before&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;      // Do not suppress the focus border if we are already focused. If we&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // did, we&apos;d hide the focus border briefly then show it again if the&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      // user has Top Sites disabled, creating a flashing effect.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;autoOpen&lt;/span&gt;&lt;span&gt;({&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;, add:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;     // doubleClickSelectsAll&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;detail&lt;/span&gt;&lt;span&gt; ==&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       this&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       event&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;preventDefault&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;to get the &lt;code&gt;doubleClickSelectsAll&lt;/code&gt; behaviour.&lt;/p&gt;
&lt;p&gt;Note that this will &lt;em&gt;not&lt;/em&gt; put the url into primary selection
upon double click. This can be useful sometimes, if you just
would like to replace the current url with the one currently
in primary selection.
If you would like to put the url into primary selection
upon double click, which completely restores the original
behaviour, change &lt;code&gt;this.select();&lt;/code&gt; to &lt;code&gt;this.inputField.select();&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I have also made a patch (command &lt;code&gt;diff -Naru omni-orig omni-new&lt;/code&gt;). &lt;a href=&quot;/code/firefox-no-clickSelectsAll-fix.patch&quot;&gt;Download the patch&lt;/a&gt; here.&lt;/p&gt;
&lt;p&gt;There is also the search bar to change. The original Superuser answer
suggests this, but as I do not use the search bar, I have not
tried it out, nor do I know what the original behaviour of it was.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; -i&lt;/span&gt;&lt;span&gt; &apos;s/this\._preventClickSelectsAll = this\._textbox\.focused;/this._preventClickSelectsAll = true;/&apos;&lt;/span&gt;&lt;span&gt;  omni/chrome/browser/content/browser/search/searchbar.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After editing, we need to re-pack the files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; omni&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;zip&lt;/span&gt;&lt;span&gt; -0DXqr&lt;/span&gt;&lt;span&gt; ../omni.ja&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And replace the original one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; -v&lt;/span&gt;&lt;span&gt; omni.ja&lt;/span&gt;&lt;span&gt; /opt/firefox/browser/omni.ja&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You may need to change the ownership of the newly-created archive:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;chown&lt;/span&gt;&lt;span&gt; [U]:[G] /opt/firefox/browser/omni.ja&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;where &lt;code&gt;[U]&lt;/code&gt; and &lt;code&gt;[G]&lt;/code&gt; refers to the owner and group of the original
file (we made a backup at &lt;code&gt;omni.ja.orig&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;To ensure everything takes effect, make a file called &lt;code&gt;.purgecaches&lt;/code&gt;
to make Firefox aware of the changes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;touch&lt;/span&gt;&lt;span&gt; /opt/firefox/browser/.purgecaches&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, from now on, we shall no longer suffer from the &lt;code&gt;clickSelectsAll&lt;/code&gt;
bug.&lt;/p&gt;
&lt;p&gt;Also, you may want to have additional configurations, such as
&lt;a href=&quot;https://www.userchrome.org/megabar-styling-firefox-address-bar.html&quot;&gt;disabling the pop-up list upon clicking address bar&lt;/a&gt;
or &lt;a href=&quot;https://github.com/WesleyBranton/Remove-Firefox-Megabar/blob/master/remove_megabar.css&quot;&gt;gettind rid of the address bar expanding effect&lt;/a&gt;
when clicked upon.&lt;/p&gt;</content></entry><entry><id>https://blog.tusooa.xyz/2018/04/29/short-code/</id><title>短代码(一个马后炮)</title><link rel="alternate" href="https://blog.tusooa.xyz/2018/04/29/short-code/"/><published>2018-04-29T06:58:57.000Z</published><content type="html">&lt;p&gt;没赶上报名截止日期，一直 &lt;code&gt;not invited&lt;/code&gt;。就很难过。&lt;/p&gt;
&lt;p&gt;E 的题目描述是这样的。&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;#Description&quot;&gt;Description&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;tz学姐做题很忙，有一些简单的问题需要你帮忙解决：给定三个序列A,B,C和一个整数X, 现在需要找到三个数Ai，Bj，Ck，满足Ai+Bj+Ck = X.&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;#Input&quot;&gt;Input&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;第1行三个整数 L, N, M；&lt;/p&gt;
&lt;p&gt;第2行L个整数代表序列A&lt;/p&gt;
&lt;p&gt;第3行M个整数代表序列B&lt;/p&gt;
&lt;p&gt;第4行N个整数代表序列C&lt;/p&gt;
&lt;p&gt;第5行1个整数S代表有S个X。&lt;/p&gt;
&lt;p&gt;接下来的S行每行一个整数X&lt;/p&gt;
&lt;p&gt;1&amp;lt;=L, N, M&amp;lt;=500, 1&amp;lt;=S&amp;lt;=1000. 所有整数均在32位整数范围内&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;#Output&quot;&gt;Output&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;对于S个询问计算X对应的公式是否能被满足。 如能满足，输出 &quot;YES&quot;, 否则输出 &quot;NO&quot;。&lt;/p&gt;
&lt;h1&gt;&lt;a href=&quot;#Sample-Input&quot;&gt;Sample Input&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;3 3 3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1 2 3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1 2 3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1 2 3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;a href=&quot;#Sample-Output&quot;&gt;Sample Output&lt;/a&gt;&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;NO&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;YES&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;NO&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;&lt;a href=&quot;#喵&quot;&gt;喵&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;我当时给出的代码是这样的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;using namespace std;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  int&lt;/span&gt;&lt;span&gt; l,m,n;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;n;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  int&lt;/span&gt;&lt;span&gt; a[l],b[m],c[n];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:a)cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:b)cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:c)cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  sort&lt;/span&gt;&lt;span&gt;(c,c&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;n);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;n;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; p;cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;){&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; q:a)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; r:b)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;binary_search&lt;/span&gt;&lt;span&gt;(c,c&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;n,p&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;q&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;r)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          cout&lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt;&quot;YES&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          goto&lt;/span&gt;&lt;span&gt; l;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cout&lt;/span&gt;&lt;span&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt;&quot;NO&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  l:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;//292&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于我不能提交，无法判断它是否超时了。查了一下网上的做法，是把 &lt;code&gt;a&lt;/code&gt; 和 &lt;code&gt;b&lt;/code&gt; 加起来存到另一个数组里，然后对这个新的数组排序查找。&lt;/p&gt;
&lt;p&gt;仔细分析一下就是：&lt;/p&gt;
&lt;p&gt;我的方法，排序用了 &lt;code&gt;O(n*log n)&lt;/code&gt;，查找 &lt;code&gt;O(n**2*log n)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;另一个做法，排序 &lt;code&gt;O(n**2*log n)&lt;/code&gt;，查找 &lt;code&gt;O(n*log n)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;看上去好像正好抵消了没什么区别。问题在于查找是&lt;strong&gt;多次&lt;/strong&gt;查找，我们希望每次查找的时间尽量短。&lt;/p&gt;
&lt;p&gt;所以改过的代码是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#include&lt;/span&gt;&lt;span&gt; &amp;lt;algorithm&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;using namespace std;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; main&lt;/span&gt;&lt;span&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  int&lt;/span&gt;&lt;span&gt; l,m,n,r&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;n;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  int&lt;/span&gt;&lt;span&gt; a[l],b[m],c[n],S[l&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;m];&lt;/span&gt;&lt;span&gt; // GNU 扩展的变长数组&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:a)cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // range-for 输入第二组数据，同时将输入的数据和第一组的每一个数字相累加，结果存到 `S` 里。&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:b) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;q:a)S[r&lt;/span&gt;&lt;span&gt;++&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;q;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;p:c)cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  sort&lt;/span&gt;&lt;span&gt;(S,S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;r);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;n;&lt;/span&gt;&lt;span&gt; // 丢弃个数信息，因为不需要&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; p;cin&lt;/span&gt;&lt;span&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span&gt;p;){&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    for&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; q:c)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;binary_search&lt;/span&gt;&lt;span&gt;(S,S&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;r,p&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;q)){&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        puts&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;YES&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        goto&lt;/span&gt;&lt;span&gt; l;&lt;/span&gt;&lt;span&gt; // 直接跳到下次输入，不输出 NO&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    puts&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;NO&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  l:&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;//311&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;排名表上最短是345。&lt;/p&gt;
&lt;p&gt;但是有什么用呢。我又不能提交(以后一定要提前关注一下)。&lt;/p&gt;</content></entry></feed>