自信満々に書いたコードの評価が MLEだった話
はぁ...
ブログ用に始めて解いた問題でMLEが出たので報告します。
問題
ABC049C - 白昼夢 / Daydream
問題文
https://atcoder.jp/contests/abs/tasks/arc065_a
解決方針
- 文字列を左から5文字見て "dream","erase" かを確かめる
- それぞれ"dreamer","eraser" にならないかを確かめる
- "dreamer"が検出された場合"dreamerase", "dreameraser" になるかもしれないのでそれも確かめる
- 文字列を最後まで見終わったら結果を出力
当時これでいけるだろうとたかをくくっていた
感想
正直どこが原因なのか分かってないので再度考え直します。
コードをチェックしてくれた友人が"TLE"起きなさそうだしとかいってたら"MLE"が出たので、 もしかしたらやまこーさんはフラグ回収能力が高いのかもしrフラグ回収能力が高いのかもしれない(?)
解決したらまたブログ更新します。バイバイ(下におまけのコードがあるよ)
実際のコード
import java.util.Scanner; public class Main { static String T = ""; public static void main(String args[]) { Scanner sc = new Scanner(System.in); String str = sc.next(); String[] strs = str.split(""); for(int i = 0; i < strs.length;){ if(checkDream(i,strs) != "error"){ T += checkDream(i,strs); }else if(checkErase(i,strs) != "error"){ T += checkErase(i,strs); }else{ System.out.println("NO"); return; } i = T.length(); } if(T.equals(str)){ System.out.println("YES"); }else{ System.out.println("NO"); } } public static String checkDream(int index, String[] strs){ String temp = ""; try{ for(int i = index; i < index + 5;i++){ temp = temp + strs[i]; } if(temp.equals("dream")){ temp += strs[index + 5] + strs[index + 6]; if(temp.equals("dreamer")){ if(checkErase(index + 5,strs) != "error"){ return "dream" + checkErase(index + 5,strs); }else{ return "dreamer"; } }else{ return "dream"; } }else{ return "error"; } }catch(Exception e){ if(!temp.equals("dream")){ return "error"; }else{ return "dream"; } } } public static String checkErase(int index, String[] strs){ String temp = ""; try{ for(int i = index; i < index + 5;i++){ temp = temp + strs[i]; } if(temp.equals("erase")){ temp += strs[index + 5]; if(temp.equals("eraser")){ return "eraser"; }else{ return "erase"; } }else{ return "error"; } }catch(Exception e){ if(!temp.equals("erase")){ return "error"; }else{ return "error"; } } } }