模擬国内予選2014 Problem C 壊れた暗号生成器

Slides:



Advertisements
Similar presentations
Problem A : Everlasting...? 原案 : 泉 模範解答 : 黄・野田 解説 : 野田.
Advertisements

1 線形代数学. 2 履修にあたって 電子情報システム学科 必修 2005 年度1セメスタ開講 担当 草苅良至 (電子情報システム学科) 教官室: G I 511 内線: 2095 質問等は上記のいずれかに行なうこと。 注意計算用のノートを準備すること。
模擬国内予選2013 Problem F テトラ姫のパズル 原案:須藤 解答:大友、須藤 解説:須藤.
J: Magical Switches JAG 模擬地区予選 2013 原案:保坂 解答:保坂・楠本 解説:保坂.
Problem J: いにしえの数式 問題作成・解説: 北村 解答作成協力: 八森.
プログラムのパタン演習 解説.
Revenge of the Round Table
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
JavaScript プログラミング入門 2006/11/10 神津.
コンパイラ 2011年10月17日
Problem J Tile Puzzle 原案:野田 担当:平野,吉田,泉,松本.
I: Tokyo Olympics Center
問題作成・解説: 北村 解答作成協力: 小西・松本
Problem G : Entangled Tree
プログラミング基礎I(再) 山元進.
最適化ソルバーのための Python言語入門
第13回 プログラミングⅡ 第13回
String - 文字列 2009年10月9日 7ADD2116 佐藤洋輔.
原案: 矢藤(kohyatoh) 解答: 高原(rankalee, shimejitan), 矢藤 解説: 矢藤
Problem C: Princess' Japanese
情報教育論 第9回 仮定文の仕組み 政策・メディア研究科 岡田 健.
ACM ICPC 国内予選 2006 模擬練習会総評 2006 / 06 / 18 ACM ICPC OB/OG 会.
2013年度模擬アジア地区予選 Problem E: Putter
言語処理系(5) 金子敬一.
プログラミング論 II 電卓,逆ポーランド記法電卓
問題 1 キーボードから入力した数の合計を計算するプログラムを 作成せよ。最初に、何個の数を入力するかその数を入力 するようにする。
コンパイラ 2012年10月15日
コンパイラ 2012年10月22日
コンパイラ 2011年10月24日
第10章 char 文字列; 文字列を入力させるよ!.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング言語論 第3回 BNF記法について(演習付き)
FlexとBison+アルファ -実習編-
プログラミング論 II 2008年10月30日 文字列
前回の練習問題.
高度プログラミング演習 (08).
2章 暗号技術 FM15002 友池 絲子.
ソフトウェア制作論 平成30年9月26日.
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
東京工科大学 コンピュータサイエンス学部 亀田弘之
バイトコードを単位とするJavaスライスシステムの試作
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
東京工科大学 コンピュータサイエンス学部 亀田弘之
コンパイラ 2011年10月20日
生物情報ソフトウェア特論 (2)たたみ込みとハッシュに 基づくマッチング
形式言語とオートマトン 中間試験解答例 2016年11月15実施 中島毅.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
JavaScriptを含んだHTML文書に対する データフロー解析を用いた構文検証手法の提案
D: 壊れかけのヒープ 問題案: 稲葉.
補講:アルゴリズムと漸近的評価.
データ構造とアルゴリズム (第5回) 静岡大学工学部 安藤和敏
計算の理論 I -数学的概念と記法- 火曜 12:50~14:20 大月 美佳 2004年4月20日.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
5.チューリングマシンと計算.
プログラミング言語論 第10回 情報工学科 篠埜 功.
~sumii/class/proenb2010/ml2/
計算の理論 I -数学的概念と記法- 月曜3校時 大月 美佳.
C言語講座 制御(選択) 2006年 計算技術研究会.
2006/6/27(通信コース)2006/7/5(情報コース) 住井
4.プッシュダウンオートマトンと 文脈自由文法の等価性
情報処理Ⅱ 2005年10月28日(金).
プログラミング論 文字列
コンパイラ 2012年10月11日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
情報生命科学特別講義III (3)たたみ込みとハッシュに 基づくマッチング
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理Ⅱ 小テスト 2005年2月1日(火).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

模擬国内予選2014 Problem C 壊れた暗号生成器 原案:須藤 解答:河田,森,井上,    保坂,伊藤,須藤 解説:須藤

問題概要 以下のような暗号を考える アルファベットだった箇所がいくつか ? になっている 制約 +(文字):次のアルファベットを表す (例: +A=B, ++A=C) -(文字):前のアルファベットを表す (例: -B=A, --C=A) [(文字列)] : 中身を反転した文字列を表す (例: [MCA] = ACM) アルファベットだった箇所がいくつか ? になっている 復号したとき辞書順最小になるよう ? を埋めた時の 復号後の文字列を求めよ 例: J?G なら JAG, JBG, ..., JZG が有り得るので,JAG が答え 制約 与えられる暗号文の長さは80文字以下 暗号文に含まれる ? の数は3個以下 JAG 模擬国内予選2014

解法その1 ? の埋め方を全部試す 復号後の文字列のうち辞書順最小だったものを出力 計算量は O(暗号文の長さ*26?の数) [M+B+?] なら [M+B+A], ..., [M+B+Z]を全部復号してみる BCM, ..., ZCM, ACM が得られるので,ACMを出力 計算量は O(暗号文の長さ*26?の数) 26はアルファベットの種類数 ?の数が3個なら暗号文の埋め方は 263 = 17576 通り 暗号文の復号は文字列長の長さの線形時間で出来る(詳細は後述) 暗号文の長さが最大で80, ?が3個以下なので十分間に合う JAG 模擬国内予選2014

解法その2 暗号文を復号してから ? を埋める その後,?の位置を全て’A’で置換したものが答え 計算量は O(暗号文の長さ) +? も -? も ? として,まずは復号してしまう その後,?の位置を全て’A’で置換したものが答え 文字の順序関係は?の埋め方によらず不変 よって,?の位置をAで置換すれば辞書順最小の復号結果になる 例) J---?---J → J?G → JAG 計算量は O(暗号文の長さ) ”? の数が3個以下”という制約がなくても間に合う JAG 模擬国内予選2014

暗号文の復号(1/4) 暗号文の復号はいわゆる「構文解析」の問題 ICPCではたびたび出題されます(簡単なものから難しいものまで) 国内予選:2008年C, 2013年C アジア地区予選:2009年F, 2010年J, 2011年H 今回のようにBNFが与えられる場合は, 文法ごとに処理を書いていくと書きやすいです 次ページから実装例とともに解説します グローバル変数として,暗号文を表す文字列s, 何文字目を読んでいるかを表す整数idxが定義してあるとします JAG 模擬国内予選2014

暗号文の復号(2/4) <Cipher> ::= <String> | <Cipher><String> “Cipher は String か, CipherとString を並べたもの”という意味 今回の場合は, Cipher は String を1個以上並べたものとして 処理をして良い(四則演算など処理順が問題になる場合は注意) Cipher を読む関数の実装例 string readCipher(){ string res = “”; // 読んでいるCipherの終端に来るまでStringを読む // []で囲われているCipherの場合は’]’が終端 while(idx < s.size() && s[idx] != ‘]’){ res += readString(); } return res; JAG 模擬国内予選2014

暗号文の復号(3/4) <String> ::= <Letter> | '['<Cipher>']‘ ‘[‘で始まれば [<Cipher>], そうでなければ<Letter> Stringを読む関数の実装例 string readString(){ string res = “”; if(s[idx] == ‘[’){ ++idx; // ‘[‘の分 res = readCipher(); // []内のCipherをよむ reverse(res.begin(), res.end()); // 文字列の反転(C++) ++idx; // ‘]‘の分 } else { res = readLetter(); // <Letter>を読む関数 } return res; } JAG 模擬国内予選2014

暗号文の復号(4/4) <Letter> ::= ‘+’<Letter> | ‘-’<Letter> | [A-Z] Letterを読む関数の実装例(?の処理は省略) string readLetter(){ if(s[idx] == ‘+’){ ++idx; // ‘+‘の分 string res = readLetter(); res = nextLetter(res); // resの次のアルファベットにする(実装略) } else if(s[idx] == ‘-’){ // ‘+’<Letter> と同様 } else { // s[idx]は大文字のアルファベット // idxを1進め,s[idx]の箇所のアルファベットを返す } JAG 模擬国内予選2014

ジャッジ解 河田:71行(1,437B), C++ 森 :91行(2,013B), C++ 井上:44行(998B), C++ 保坂:112行(2,391B), Java 伊藤:93行(1,854B), Java 須藤:42行(816B), C++ JAG 模擬国内予選2014