ページ内の「A[BRG]C000-xx」といった文字列を検出してAtCoderの問題ページへのリンクに変換します。
// ==UserScript==
// @name AtCoder Linkifier
// @version 1.2
// @namespace https://github.com/fe2O3-Tpa
// @match *://*/*
// @exclude *://atcoder.jp/*
// @grant none
// @run-at document-idle
// @description ページ内の「A[BRG]C000-xx」といった文字列を検出してAtCoderの問題ページへのリンクに変換します。
// @author Prrapp(Fe2O3-Tpa) / Gemini
// @license MIT
// ==/UserScript==
(function () {
'use strict';
const regex = /A[BRG]C\d{3}(?:\s*-\s*|\s*)[A-Za-z]{1,2}/g;
const from_abc042_to_abc111_urls = {
"ABC041-A": "https://atcoder.jp/contests/abc041/tasks/abc041_a",
"ABC041-B": "https://atcoder.jp/contests/abc041/tasks/abc041_b",
"ABC041-C": "https://atcoder.jp/contests/abc041/tasks/abc041_c",
"ABC041-D": "https://atcoder.jp/contests/abc041/tasks/abc041_d",
"ABC042-A": "https://atcoder.jp/contests/abc042/tasks/abc042_a",
"ABC042-B": "https://atcoder.jp/contests/abc042/tasks/abc042_b",
"ABC042-C": "https://atcoder.jp/contests/abc042/tasks/arc058_a",
"ABC042-D": "https://atcoder.jp/contests/abc042/tasks/arc058_b",
"ABC043-A": "https://atcoder.jp/contests/abc043/tasks/abc043_a",
"ABC043-B": "https://atcoder.jp/contests/abc043/tasks/abc043_b",
"ABC043-C": "https://atcoder.jp/contests/abc043/tasks/arc059_a",
"ABC043-D": "https://atcoder.jp/contests/abc043/tasks/arc059_b",
"ABC044-A": "https://atcoder.jp/contests/abc044/tasks/abc044_a",
"ABC044-B": "https://atcoder.jp/contests/abc044/tasks/abc044_b",
"ABC044-C": "https://atcoder.jp/contests/abc044/tasks/arc060_a",
"ABC044-D": "https://atcoder.jp/contests/abc044/tasks/arc060_b",
"ABC045-A": "https://atcoder.jp/contests/abc045/tasks/abc045_a",
"ABC045-B": "https://atcoder.jp/contests/abc045/tasks/abc045_b",
"ABC045-C": "https://atcoder.jp/contests/abc045/tasks/arc061_a",
"ABC045-D": "https://atcoder.jp/contests/abc045/tasks/arc061_b",
"ABC046-A": "https://atcoder.jp/contests/abc046/tasks/abc046_a",
"ABC046-B": "https://atcoder.jp/contests/abc046/tasks/abc046_b",
"ABC046-C": "https://atcoder.jp/contests/abc046/tasks/arc062_a",
"ABC046-D": "https://atcoder.jp/contests/abc046/tasks/arc062_b",
"ABC047-A": "https://atcoder.jp/contests/abc047/tasks/abc047_a",
"ABC047-B": "https://atcoder.jp/contests/abc047/tasks/abc047_b",
"ABC047-C": "https://atcoder.jp/contests/abc047/tasks/arc063_a",
"ABC047-D": "https://atcoder.jp/contests/abc047/tasks/arc063_b",
"ABC048-A": "https://atcoder.jp/contests/abc048/tasks/abc048_a",
"ABC048-B": "https://atcoder.jp/contests/abc048/tasks/abc048_b",
"ABC048-C": "https://atcoder.jp/contests/abc048/tasks/arc064_a",
"ABC048-D": "https://atcoder.jp/contests/abc048/tasks/arc064_b",
"ABC049-A": "https://atcoder.jp/contests/abc049/tasks/abc049_a",
"ABC049-B": "https://atcoder.jp/contests/abc049/tasks/abc049_b",
"ABC049-C": "https://atcoder.jp/contests/abc049/tasks/arc065_a",
"ABC049-D": "https://atcoder.jp/contests/abc049/tasks/arc065_b",
"ABC050-A": "https://atcoder.jp/contests/abc050/tasks/abc050_a",
"ABC050-B": "https://atcoder.jp/contests/abc050/tasks/abc050_b",
"ABC050-C": "https://atcoder.jp/contests/abc050/tasks/arc066_a",
"ABC050-D": "https://atcoder.jp/contests/abc050/tasks/arc066_b",
"ABC051-A": "https://atcoder.jp/contests/abc051/tasks/abc051_a",
"ABC051-B": "https://atcoder.jp/contests/abc051/tasks/abc051_b",
"ABC051-C": "https://atcoder.jp/contests/abc051/tasks/abc051_c",
"ABC051-D": "https://atcoder.jp/contests/abc051/tasks/abc051_d",
"ABC052-A": "https://atcoder.jp/contests/abc052/tasks/abc052_a",
"ABC052-B": "https://atcoder.jp/contests/abc052/tasks/abc052_b",
"ABC052-C": "https://atcoder.jp/contests/abc052/tasks/arc067_a",
"ABC052-D": "https://atcoder.jp/contests/abc052/tasks/arc067_b",
"ABC053-A": "https://atcoder.jp/contests/abc053/tasks/abc053_a",
"ABC053-B": "https://atcoder.jp/contests/abc053/tasks/abc053_b",
"ABC053-C": "https://atcoder.jp/contests/abc053/tasks/arc068_a",
"ABC053-D": "https://atcoder.jp/contests/abc053/tasks/arc068_b",
"ABC054-A": "https://atcoder.jp/contests/abc054/tasks/abc054_a",
"ABC054-B": "https://atcoder.jp/contests/abc054/tasks/abc054_b",
"ABC054-C": "https://atcoder.jp/contests/abc054/tasks/abc054_c",
"ABC054-D": "https://atcoder.jp/contests/abc054/tasks/abc054_d",
"ABC055-A": "https://atcoder.jp/contests/abc055/tasks/abc055_a",
"ABC055-B": "https://atcoder.jp/contests/abc055/tasks/abc055_b",
"ABC055-C": "https://atcoder.jp/contests/abc055/tasks/arc069_a",
"ABC055-D": "https://atcoder.jp/contests/abc055/tasks/arc069_b",
"ABC056-A": "https://atcoder.jp/contests/abc056/tasks/abc056_a",
"ABC056-B": "https://atcoder.jp/contests/abc056/tasks/abc056_b",
"ABC056-C": "https://atcoder.jp/contests/abc056/tasks/arc070_a",
"ABC056-D": "https://atcoder.jp/contests/abc056/tasks/arc070_b",
"ABC057-A": "https://atcoder.jp/contests/abc057/tasks/abc057_a",
"ABC057-B": "https://atcoder.jp/contests/abc057/tasks/abc057_b",
"ABC057-C": "https://atcoder.jp/contests/abc057/tasks/abc057_c",
"ABC057-D": "https://atcoder.jp/contests/abc057/tasks/abc057_d",
"ABC058-A": "https://atcoder.jp/contests/abc058/tasks/abc058_a",
"ABC058-B": "https://atcoder.jp/contests/abc058/tasks/abc058_b",
"ABC058-C": "https://atcoder.jp/contests/abc058/tasks/arc071_a",
"ABC058-D": "https://atcoder.jp/contests/abc058/tasks/arc071_b",
"ABC059-A": "https://atcoder.jp/contests/abc059/tasks/abc059_a",
"ABC059-B": "https://atcoder.jp/contests/abc059/tasks/abc059_b",
"ABC059-C": "https://atcoder.jp/contests/abc059/tasks/arc072_a",
"ABC059-D": "https://atcoder.jp/contests/abc059/tasks/arc072_b",
"ABC060-A": "https://atcoder.jp/contests/abc060/tasks/abc060_a",
"ABC060-B": "https://atcoder.jp/contests/abc060/tasks/abc060_b",
"ABC060-C": "https://atcoder.jp/contests/abc060/tasks/arc073_a",
"ABC060-D": "https://atcoder.jp/contests/abc060/tasks/arc073_b",
"ABC061-A": "https://atcoder.jp/contests/abc061/tasks/abc061_a",
"ABC061-B": "https://atcoder.jp/contests/abc061/tasks/abc061_b",
"ABC061-C": "https://atcoder.jp/contests/abc061/tasks/abc061_c",
"ABC061-D": "https://atcoder.jp/contests/abc061/tasks/abc061_d",
"ABC062-A": "https://atcoder.jp/contests/abc062/tasks/abc062_a",
"ABC062-B": "https://atcoder.jp/contests/abc062/tasks/abc062_b",
"ABC062-C": "https://atcoder.jp/contests/abc062/tasks/arc074_a",
"ABC062-D": "https://atcoder.jp/contests/abc062/tasks/arc074_b",
"ABC063-A": "https://atcoder.jp/contests/abc063/tasks/abc063_a",
"ABC063-B": "https://atcoder.jp/contests/abc063/tasks/abc063_b",
"ABC063-C": "https://atcoder.jp/contests/abc063/tasks/arc075_a",
"ABC063-D": "https://atcoder.jp/contests/abc063/tasks/arc075_b",
"ABC064-A": "https://atcoder.jp/contests/abc064/tasks/abc064_a",
"ABC064-B": "https://atcoder.jp/contests/abc064/tasks/abc064_b",
"ABC064-C": "https://atcoder.jp/contests/abc064/tasks/abc064_c",
"ABC064-D": "https://atcoder.jp/contests/abc064/tasks/abc064_d",
"ABC065-A": "https://atcoder.jp/contests/abc065/tasks/abc065_a",
"ABC065-B": "https://atcoder.jp/contests/abc065/tasks/abc065_b",
"ABC065-C": "https://atcoder.jp/contests/abc065/tasks/arc076_a",
"ABC065-D": "https://atcoder.jp/contests/abc065/tasks/arc076_b",
"ABC066-A": "https://atcoder.jp/contests/abc066/tasks/abc066_a",
"ABC066-B": "https://atcoder.jp/contests/abc066/tasks/abc066_b",
"ABC066-C": "https://atcoder.jp/contests/abc066/tasks/arc077_a",
"ABC066-D": "https://atcoder.jp/contests/abc066/tasks/arc077_b",
"ABC067-A": "https://atcoder.jp/contests/abc067/tasks/abc067_a",
"ABC067-B": "https://atcoder.jp/contests/abc067/tasks/abc067_b",
"ABC067-C": "https://atcoder.jp/contests/abc067/tasks/arc078_a",
"ABC067-D": "https://atcoder.jp/contests/abc067/tasks/arc078_b",
"ABC068-A": "https://atcoder.jp/contests/abc068/tasks/abc068_a",
"ABC068-B": "https://atcoder.jp/contests/abc068/tasks/abc068_b",
"ABC068-C": "https://atcoder.jp/contests/abc068/tasks/arc079_a",
"ABC068-D": "https://atcoder.jp/contests/abc068/tasks/arc079_b",
"ABC069-A": "https://atcoder.jp/contests/abc069/tasks/abc069_a",
"ABC069-B": "https://atcoder.jp/contests/abc069/tasks/abc069_b",
"ABC069-C": "https://atcoder.jp/contests/abc069/tasks/arc080_a",
"ABC069-D": "https://atcoder.jp/contests/abc069/tasks/arc080_b",
"ABC070-A": "https://atcoder.jp/contests/abc070/tasks/abc070_a",
"ABC070-B": "https://atcoder.jp/contests/abc070/tasks/abc070_b",
"ABC070-C": "https://atcoder.jp/contests/abc070/tasks/abc070_c",
"ABC070-D": "https://atcoder.jp/contests/abc070/tasks/abc070_d",
"ABC071-A": "https://atcoder.jp/contests/abc071/tasks/abc071_a",
"ABC071-B": "https://atcoder.jp/contests/abc071/tasks/abc071_b",
"ABC071-C": "https://atcoder.jp/contests/abc071/tasks/arc081_a",
"ABC071-D": "https://atcoder.jp/contests/abc071/tasks/arc081_b",
"ABC072-A": "https://atcoder.jp/contests/abc072/tasks/abc072_a",
"ABC072-B": "https://atcoder.jp/contests/abc072/tasks/abc072_b",
"ABC072-C": "https://atcoder.jp/contests/abc072/tasks/arc082_a",
"ABC072-D": "https://atcoder.jp/contests/abc072/tasks/arc082_b",
"ABC073-A": "https://atcoder.jp/contests/abc073/tasks/abc073_a",
"ABC073-B": "https://atcoder.jp/contests/abc073/tasks/abc073_b",
"ABC073-C": "https://atcoder.jp/contests/abc073/tasks/abc073_c",
"ABC073-D": "https://atcoder.jp/contests/abc073/tasks/abc073_d",
"ABC074-A": "https://atcoder.jp/contests/abc074/tasks/abc074_a",
"ABC074-B": "https://atcoder.jp/contests/abc074/tasks/abc074_b",
"ABC074-C": "https://atcoder.jp/contests/abc074/tasks/arc083_a",
"ABC074-D": "https://atcoder.jp/contests/abc074/tasks/arc083_b",
"ABC075-A": "https://atcoder.jp/contests/abc075/tasks/abc075_a",
"ABC075-B": "https://atcoder.jp/contests/abc075/tasks/abc075_b",
"ABC075-C": "https://atcoder.jp/contests/abc075/tasks/abc075_c",
"ABC075-D": "https://atcoder.jp/contests/abc075/tasks/abc075_d",
"ABC076-A": "https://atcoder.jp/contests/abc076/tasks/abc076_a",
"ABC076-B": "https://atcoder.jp/contests/abc076/tasks/abc076_b",
"ABC076-C": "https://atcoder.jp/contests/abc076/tasks/abc076_c",
"ABC076-D": "https://atcoder.jp/contests/abc076/tasks/abc076_d",
"ABC077-A": "https://atcoder.jp/contests/abc077/tasks/abc077_a",
"ABC077-B": "https://atcoder.jp/contests/abc077/tasks/abc077_b",
"ABC077-C": "https://atcoder.jp/contests/abc077/tasks/arc084_a",
"ABC077-D": "https://atcoder.jp/contests/abc077/tasks/arc084_b",
"ABC078-A": "https://atcoder.jp/contests/abc078/tasks/abc078_a",
"ABC078-B": "https://atcoder.jp/contests/abc078/tasks/abc078_b",
"ABC078-C": "https://atcoder.jp/contests/abc078/tasks/arc085_a",
"ABC078-D": "https://atcoder.jp/contests/abc078/tasks/arc085_b",
"ABC079-A": "https://atcoder.jp/contests/abc079/tasks/abc079_a",
"ABC079-B": "https://atcoder.jp/contests/abc079/tasks/abc079_b",
"ABC079-C": "https://atcoder.jp/contests/abc079/tasks/abc079_c",
"ABC079-D": "https://atcoder.jp/contests/abc079/tasks/abc079_d",
"ABC080-A": "https://atcoder.jp/contests/abc080/tasks/abc080_a",
"ABC080-B": "https://atcoder.jp/contests/abc080/tasks/abc080_b",
"ABC080-C": "https://atcoder.jp/contests/abc080/tasks/abc080_c",
"ABC080-D": "https://atcoder.jp/contests/abc080/tasks/abc080_d",
"ABC081-A": "https://atcoder.jp/contests/abc081/tasks/abc081_a",
"ABC081-B": "https://atcoder.jp/contests/abc081/tasks/abc081_b",
"ABC081-C": "https://atcoder.jp/contests/abc081/tasks/arc086_a",
"ABC081-D": "https://atcoder.jp/contests/abc081/tasks/arc086_b",
"ABC082-A": "https://atcoder.jp/contests/abc082/tasks/abc082_a",
"ABC082-B": "https://atcoder.jp/contests/abc082/tasks/abc082_b",
"ABC082-C": "https://atcoder.jp/contests/abc082/tasks/arc087_a",
"ABC082-D": "https://atcoder.jp/contests/abc082/tasks/arc087_b",
"ABC083-A": "https://atcoder.jp/contests/abc083/tasks/abc083_a",
"ABC083-B": "https://atcoder.jp/contests/abc083/tasks/abc083_b",
"ABC083-C": "https://atcoder.jp/contests/abc083/tasks/arc088_a",
"ABC083-D": "https://atcoder.jp/contests/abc083/tasks/arc088_b",
"ABC084-A": "https://atcoder.jp/contests/abc084/tasks/abc084_a",
"ABC084-B": "https://atcoder.jp/contests/abc084/tasks/abc084_b",
"ABC084-C": "https://atcoder.jp/contests/abc084/tasks/abc084_c",
"ABC084-D": "https://atcoder.jp/contests/abc084/tasks/abc084_d",
"ABC085-A": "https://atcoder.jp/contests/abc085/tasks/abc085_a",
"ABC085-B": "https://atcoder.jp/contests/abc085/tasks/abc085_b",
"ABC085-C": "https://atcoder.jp/contests/abc085/tasks/abc085_c",
"ABC085-D": "https://atcoder.jp/contests/abc085/tasks/abc085_d",
"ABC086-A": "https://atcoder.jp/contests/abc086/tasks/abc086_a",
"ABC086-B": "https://atcoder.jp/contests/abc086/tasks/abc086_b",
"ABC086-C": "https://atcoder.jp/contests/abc086/tasks/arc089_a",
"ABC086-D": "https://atcoder.jp/contests/abc086/tasks/arc089_b",
"ABC087-A": "https://atcoder.jp/contests/abc087/tasks/abc087_a",
"ABC087-B": "https://atcoder.jp/contests/abc087/tasks/abc087_b",
"ABC087-C": "https://atcoder.jp/contests/abc087/tasks/arc090_a",
"ABC087-D": "https://atcoder.jp/contests/abc087/tasks/arc090_b",
"ABC088-A": "https://atcoder.jp/contests/abc088/tasks/abc088_a",
"ABC088-B": "https://atcoder.jp/contests/abc088/tasks/abc088_b",
"ABC088-C": "https://atcoder.jp/contests/abc088/tasks/abc088_c",
"ABC088-D": "https://atcoder.jp/contests/abc088/tasks/abc088_d",
"ABC089-A": "https://atcoder.jp/contests/abc089/tasks/abc089_a",
"ABC089-B": "https://atcoder.jp/contests/abc089/tasks/abc089_b",
"ABC089-C": "https://atcoder.jp/contests/abc089/tasks/abc089_c",
"ABC089-D": "https://atcoder.jp/contests/abc089/tasks/abc089_d",
"ABC090-A": "https://atcoder.jp/contests/abc090/tasks/abc090_a",
"ABC090-B": "https://atcoder.jp/contests/abc090/tasks/abc090_b",
"ABC090-C": "https://atcoder.jp/contests/abc090/tasks/arc091_a",
"ABC090-D": "https://atcoder.jp/contests/abc090/tasks/arc091_b",
"ABC091-A": "https://atcoder.jp/contests/abc091/tasks/abc091_a",
"ABC091-B": "https://atcoder.jp/contests/abc091/tasks/abc091_b",
"ABC091-C": "https://atcoder.jp/contests/abc091/tasks/arc092_a",
"ABC091-D": "https://atcoder.jp/contests/abc091/tasks/arc092_b",
"ABC092-A": "https://atcoder.jp/contests/abc092/tasks/abc092_a",
"ABC092-B": "https://atcoder.jp/contests/abc092/tasks/abc092_b",
"ABC092-C": "https://atcoder.jp/contests/abc092/tasks/arc093_a",
"ABC092-D": "https://atcoder.jp/contests/abc092/tasks/arc093_b",
"ABC093-A": "https://atcoder.jp/contests/abc093/tasks/abc093_a",
"ABC093-B": "https://atcoder.jp/contests/abc093/tasks/abc093_b",
"ABC093-C": "https://atcoder.jp/contests/abc093/tasks/arc094_a",
"ABC093-D": "https://atcoder.jp/contests/abc093/tasks/arc094_b",
"ABC094-A": "https://atcoder.jp/contests/abc094/tasks/abc094_a",
"ABC094-B": "https://atcoder.jp/contests/abc094/tasks/abc094_b",
"ABC094-C": "https://atcoder.jp/contests/abc094/tasks/arc095_a",
"ABC094-D": "https://atcoder.jp/contests/abc094/tasks/arc095_b",
"ABC095-A": "https://atcoder.jp/contests/abc095/tasks/abc095_a",
"ABC095-B": "https://atcoder.jp/contests/abc095/tasks/abc095_b",
"ABC095-C": "https://atcoder.jp/contests/abc095/tasks/arc096_a",
"ABC095-D": "https://atcoder.jp/contests/abc095/tasks/arc096_b",
"ABC096-A": "https://atcoder.jp/contests/abc096/tasks/abc096_a",
"ABC096-B": "https://atcoder.jp/contests/abc096/tasks/abc096_b",
"ABC096-C": "https://atcoder.jp/contests/abc096/tasks/abc096_c",
"ABC096-D": "https://atcoder.jp/contests/abc096/tasks/abc096_d",
"ABC097-A": "https://atcoder.jp/contests/abc097/tasks/abc097_a",
"ABC097-B": "https://atcoder.jp/contests/abc097/tasks/abc097_b",
"ABC097-C": "https://atcoder.jp/contests/abc097/tasks/arc097_a",
"ABC097-D": "https://atcoder.jp/contests/abc097/tasks/arc097_b",
"ABC098-A": "https://atcoder.jp/contests/abc098/tasks/abc098_a",
"ABC098-B": "https://atcoder.jp/contests/abc098/tasks/abc098_b",
"ABC098-C": "https://atcoder.jp/contests/abc098/tasks/arc098_a",
"ABC098-D": "https://atcoder.jp/contests/abc098/tasks/arc098_b",
"ABC099-A": "https://atcoder.jp/contests/abc099/tasks/abc099_a",
"ABC099-B": "https://atcoder.jp/contests/abc099/tasks/abc099_b",
"ABC099-C": "https://atcoder.jp/contests/abc099/tasks/abc099_c",
"ABC099-D": "https://atcoder.jp/contests/abc099/tasks/abc099_d",
"ABC100-A": "https://atcoder.jp/contests/abc100/tasks/abc100_a",
"ABC100-B": "https://atcoder.jp/contests/abc100/tasks/abc100_b",
"ABC100-C": "https://atcoder.jp/contests/abc100/tasks/abc100_c",
"ABC100-D": "https://atcoder.jp/contests/abc100/tasks/abc100_d",
"ABC101-A": "https://atcoder.jp/contests/abc101/tasks/abc101_a",
"ABC101-B": "https://atcoder.jp/contests/abc101/tasks/abc101_b",
"ABC101-C": "https://atcoder.jp/contests/abc101/tasks/arc099_a",
"ABC101-D": "https://atcoder.jp/contests/abc101/tasks/arc099_b",
"ABC102-A": "https://atcoder.jp/contests/abc102/tasks/abc102_a",
"ABC102-B": "https://atcoder.jp/contests/abc102/tasks/abc102_b",
"ABC102-C": "https://atcoder.jp/contests/abc102/tasks/arc100_a",
"ABC102-D": "https://atcoder.jp/contests/abc102/tasks/arc100_b",
"ABC103-A": "https://atcoder.jp/contests/abc103/tasks/abc103_a",
"ABC103-B": "https://atcoder.jp/contests/abc103/tasks/abc103_b",
"ABC103-C": "https://atcoder.jp/contests/abc103/tasks/abc103_c",
"ABC103-D": "https://atcoder.jp/contests/abc103/tasks/abc103_d",
"ABC104-A": "https://atcoder.jp/contests/abc104/tasks/abc104_a",
"ABC104-B": "https://atcoder.jp/contests/abc104/tasks/abc104_b",
"ABC104-C": "https://atcoder.jp/contests/abc104/tasks/abc104_c",
"ABC104-D": "https://atcoder.jp/contests/abc104/tasks/abc104_d",
"ABC105-A": "https://atcoder.jp/contests/abc105/tasks/abc105_a",
"ABC105-B": "https://atcoder.jp/contests/abc105/tasks/abc105_b",
"ABC105-C": "https://atcoder.jp/contests/abc105/tasks/abc105_c",
"ABC105-D": "https://atcoder.jp/contests/abc105/tasks/abc105_d",
"ABC106-A": "https://atcoder.jp/contests/abc106/tasks/abc106_a",
"ABC106-B": "https://atcoder.jp/contests/abc106/tasks/abc106_b",
"ABC106-C": "https://atcoder.jp/contests/abc106/tasks/abc106_c",
"ABC106-D": "https://atcoder.jp/contests/abc106/tasks/abc106_d",
"ABC107-A": "https://atcoder.jp/contests/abc107/tasks/abc107_a",
"ABC107-B": "https://atcoder.jp/contests/abc107/tasks/abc107_b",
"ABC107-C": "https://atcoder.jp/contests/abc107/tasks/arc101_a",
"ABC107-D": "https://atcoder.jp/contests/abc107/tasks/arc101_b",
"ABC108-A": "https://atcoder.jp/contests/abc108/tasks/abc108_a",
"ABC108-B": "https://atcoder.jp/contests/abc108/tasks/abc108_b",
"ABC108-C": "https://atcoder.jp/contests/abc108/tasks/arc102_a",
"ABC108-D": "https://atcoder.jp/contests/abc108/tasks/arc102_b",
"ABC109-A": "https://atcoder.jp/contests/abc109/tasks/abc109_a",
"ABC109-B": "https://atcoder.jp/contests/abc109/tasks/abc109_b",
"ABC109-C": "https://atcoder.jp/contests/abc109/tasks/abc109_c",
"ABC109-D": "https://atcoder.jp/contests/abc109/tasks/abc109_d",
"ABC110-A": "https://atcoder.jp/contests/abc110/tasks/abc110_a",
"ABC110-B": "https://atcoder.jp/contests/abc110/tasks/abc110_b",
"ABC110-C": "https://atcoder.jp/contests/abc110/tasks/abc110_c",
"ABC110-D": "https://atcoder.jp/contests/abc110/tasks/abc110_d",
"ABC111-A": "https://atcoder.jp/contests/abc111/tasks/abc111_a",
"ABC111-B": "https://atcoder.jp/contests/abc111/tasks/abc111_b",
"ABC111-C": "https://atcoder.jp/contests/abc111/tasks/arc103_a",
"ABC111-D": "https://atcoder.jp/contests/abc111/tasks/arc103_b",
};
function walkAndLinkify(node) {
const walker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null);
const nodesToProcess = [];
let currentNode;
while (currentNode = walker.nextNode()) {
nodesToProcess.push(currentNode);
}
for (const textNode of nodesToProcess) {
linkifyTextNode(textNode, regex);
}
}
function linkifyTextNode(node, regex) {
const parent = node.parentNode;
const ignoreTags = ['A', 'SCRIPT', 'STYLE', 'TEXTAREA', 'INPUT', 'CODE', 'PRE'];
if (!parent || !(parent instanceof HTMLElement) || ignoreTags.includes(parent.tagName)) {
return;
}
const text = node.textContent ?? "";
let match;
const matches = [];
const localRegex = new RegExp(regex);
while ((match = localRegex.exec(text)) !== null) {
matches.push({
start: match.index,
end: localRegex.lastIndex,
text: match[0]
});
}
if (matches.length === 0)
return;
const fragment = document.createDocumentFragment();
let lastIndex = 0;
for (const m of matches) {
if (m.start > lastIndex) {
fragment.appendChild(document.createTextNode(text.substring(lastIndex, m.start)));
}
const S = m.text;
const T = S.toLowerCase();
const tlMatch = T.match(/a[brg]c\d{3}/);
const trMatch = T.match(/([a-z]{1,2})$/);
if (tlMatch && trMatch) {
const T_l = tlMatch[0];
const T_r = trMatch[1];
const url = build_problem_url({ contest: T_l, problem: T_r });
const link = document.createElement('a');
link.href = url;
link.textContent = S;
link.target = '_blank';
link.rel = 'noopener noreferrer';
link.style.textDecoration = 'underline';
link.style.fontWeight = '500';
fragment.appendChild(link);
}
else {
fragment.appendChild(document.createTextNode(S));
}
lastIndex = m.end;
}
if (lastIndex < text.length) {
fragment.appendChild(document.createTextNode(text.substring(lastIndex)));
}
parent.replaceChild(fragment, node);
}
function build_problem_url(params) {
const { contest: T_l, problem: T_r } = params;
if (!T_l.startsWith('abc')) {
return `https://atcoder.jp/contests/${T_l}/tasks/${T_l}_${T_r}`;
}
if (Number(T_l.slice(3)) >= 112) {
return `https://atcoder.jp/contests/${T_l}/tasks/${T_l}_${T_r}`;
}
else if (Number(T_l.slice(3)) >= 42) {
return from_abc042_to_abc111(T_l.slice(3), T_r);
}
else {
return `https://atcoder.jp/contests/${T_l}/tasks/${T_l}_${alphabet_to_number(T_r).toString()}`;
}
}
function alphabet_to_number(c) {
return c.charCodeAt(0) - 'a'.charCodeAt(0) + 1;
}
function from_abc042_to_abc111(contest, problem) {
return from_abc042_to_abc111_urls[`ABC${contest.toUpperCase().padStart(3, '0')}-${problem.toUpperCase()}`];
}
walkAndLinkify(document.body);
const observer = new MutationObserver((mutations) => {
observer.disconnect();
for (const mutation of mutations) {
for (const addedNode of mutation.addedNodes) {
if (addedNode.nodeType === Node.ELEMENT_NODE && addedNode instanceof HTMLElement) {
walkAndLinkify(addedNode);
}
else if (addedNode.nodeType === Node.TEXT_NODE) {
linkifyTextNode(addedNode, regex);
}
}
}
observe();
});
function observe() {
observer.observe(document.body, {
childList: true,
subtree: true
});
}
observe();
})();