Codeforces #57 (div2) B "Hard Work"

問題:http://codeforces.com/problemset/problem/61/B

ラクティス

3つの文字列と生徒の数および各生徒の解答が与えられる.3つの文字列から記号を除いたアルファベットを任意の順番で連結したとき,また解答も記号を取り除いた文字列と一致する場合を正解とし,それ以外を不正解とするとき,各生徒の解答が正解か不正解かを求める.

記号を取り除いて,3つの文字列を一回ずつ使って各生徒の解答と一致するかどうかを実装した.本番では解答に3つの文字列が含まれるかどうかだけを調べていたため,3つの文字列に部分文字列関係が含まれていた場合にアウト.コードは汚い.

コード

import java.util.*;

public class B {
	public static void main(String[] args) {
		Scanner s = new Scanner(System.in);
		List<String> strs = new ArrayList<String>();
		for (int i = 0; i < 3; ++i) {
			strs.add(s.next().toLowerCase().replaceAll("[^a-z]", ""));
		}
		Collections.sort(strs, new Comparator<String>() {
			@Override
			public int compare(String o1, String o2) {
				return o2.length() - o1.length();
			}
		});
		for (int n = s.nextInt(); n-- > 0;) {
			String line = s.next().toLowerCase().replaceAll("[^a-z]", "");
			boolean b = true;
			List<String> tmp = new ArrayList<String>(strs);
			while (b) {
				b = false;
				for (int i = 0; i < tmp.size(); ++i) {
					if (line.startsWith(tmp.get(i))) {
						line = line.replaceFirst(tmp.get(i), "");
						tmp.remove(tmp.get(i));
						b = true;
						break;
					}
				}
			}
			System.out.println(line.length() < 1 && tmp.size() < 1? "ACC" : "WA");
		}

	}
}