ARC014

http://arc014.contest.atcoder.jp/
結果は3問解いて87位。いつもより簡単だったみたいです。
全完したかった。

A:君が望むなら世界中全てのたこ焼きを赤と青に染め上げよう

偶数ならBlue, 奇数ならRedと出力するだけ。




B:あの日したしりとりの結果を僕達はまだ知らない。

何も考えずに実装し始めたせいでデータを全て取りきる前にbreakするプログラムを作ってしまうという自体に。fixするもうまくいかなかったので一度全消しして打ち直す。
かなり言語に頼った解き方になってしまった。

重複する要素のチェックがしたかったのでArrayListを採用。
ArrayList listに単語のデータを格納する。与えられた単語を格納する前にその単語の最初の文字と、前の単語の最後の文字が一致するかチェック。その単語がlistにすでに存在していないかをチェック。チェックに引っかかった場合ArrayList ansに格納。そもそもArrayListでansにする必要はなかったのでは?だとか考えたがプログラムにバグも見つからなかったのでそのまま提出。
とにかく貪欲法のようにやりたかったようだ。
ansに何も格納されていなければしりとりが最後までできているのでDRAW, 奇数ターンで違反があればLOSE, それ以外ならばWIN。
Accepted!!

import java.util.Scanner;
import java.util.ArrayList;

public class ARC014_B{
	private static final Scanner sc=new Scanner(System.in);
	
	public static void main(String[] args){
		int n=sc.nextInt();
		ArrayList<String> list=new ArrayList<String>();
		ArrayList<Integer> ans=new ArrayList<Integer>();
		
		list.add(sc.next());
		for(int i=1;i<n;i++){
			String str=sc.next();
			if(list.contains(str)){
				ans.add(i);
			}
			int l=(list.get(i-1).length())-1;
			char a=list.get(i-1).charAt(l);
			char b=str.charAt(0);
			if(a!=b){
				ans.add(i);
			}
			list.add(str);
		}
		
		if(ans.size()==0){
			System.out.println("DRAW");
		}else if(ans.get(0)%2==0){
			System.out.println("LOSE");
		}else{
			System.out.println("WIN");
		}
	}
}
C:魂の還る場所

見てすぐに思いついた解が通ってしまった。想定解法は別にあったのでは?と考える。
strに文字列を格納して'R', 'G', 'B' についてそれぞれが含まれる個数を数えて2で割った余りを足して出力。

import java.util.Scanner;

public class ARC014_C{
	private static final Scanner sc=new Scanner(System.in);
	
	public static void main(String[] args){
		int n=sc.nextInt();
		String str=sc.next();
		
		int r=str.length()-str.replaceAll("R", "").length();
		int g=str.length()-str.replaceAll("G", "").length();
		int b=str.length()-str.replaceAll("B", "").length();
		
		System.out.println((r%2)+(g%2)+(b%2));
	}
}
D:grepマスター

解けなかった。


最初に重複クエリの検出を前後だけで行い、残りは1個前の答えからの差分で計算するらしい。