AOJ1121 Kanglish:Analysis on Artificial Language

問題リンク Kanglish:Analysis on Artificial Language

  • 概要

Kanglishという言語は26個のアルファベットに加え、さらに2文字で1文字を表す語12個を加えた38文字からなるものである。
今文章が与えられる。38個の文字それぞれについて、右隣にきている語の中で最も頻度の高いものとその回数を答えよ。
文章は左から見ていき、長さの大きい語から優先して認識される。例えば、"ncw"は"nc""w"と認識され、"n""cw"や"n""c""w"とは認識されない。また、語の間に空白を挟んでいる場合は隣接しているとは見なされない。

  • 解法

文字列を左から見ていき、長い方の語からマッチングをかけていきます。文字iの右隣に文字jが来た回数を2次元配列で覚えていけばいいと思います。

  • ソース
import java.util.Scanner;

//Kanglish:Analysis on Artificial Language
public class AOJ1121 {

	void run(){
		String[] kang = {"a", "b", "c", "d", "e", "f", "g", "h",
				"i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
				"s", "t", "u", "v", "w", "x", "y", "z",
				"ld", "mb", "mp", "nc", "nd", "ng", "nt", "nw", "ps", "qu", "cw", "ts"
		};
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt(); sc.nextLine();
		int[][] c = new int[38][38];
		while(N--!=0){
			for(String s:sc.nextLine().split(" ")){
				int p = -1;
				while(!"".equals(s)){
					for(int k=37;k>=0;k--){
						if(s.startsWith(kang[k])){
							if(p!=-1)c[p][k]++;
							p = k;
							s = s.substring(kang[k].length(), s.length());
							break;
						}
					}
				}
			}
		}
		for(int i=0;i<38;i++){
			int k = 0;
			for(int j=1;j<38;j++){
				if(c[i][k]<c[i][j])k=j;
			}
			System.out.println(kang[i]+" "+kang[k]+" "+c[i][k]);
		}
	}
	
	public static void main(String[] args) {
		new AOJ1121().run();
	}
}