kmjp's blog

競技プログラミング参加記です

Google Code Jam 2016 Round1B : A. Getting the Digits

いきなり引っかかって手間取った。
https://code.google.com/codejam/contest/11254486/dashboard#s=p0&a=2

問題

幾つかの数字からなる文字列がある。
それぞれを英語表記に置き換えて連結し、順番を並べ替えたものが与えられる。
元の文字列にあった数字を列挙せよ。

解法

残されたアルファベット群のうち、「この数字からしか生成されない文字」を含むものがあれば、その分元の文字列がその数字を含むことになる。
具体的にはZGHWRXSFIOの順で数を数えれば、0832467591の登場回数がわかる。

void solve(int _loop) {
	int f,i,j,k,l,x,y;
	string S;
	int cnt[256]={};
	int ret[10]={};
	cin>>S;
	FORR(r,S) cnt[r]++;
	
	_P("Case #%d: ",_loop);
	
	while(cnt['Z']) ret[0]++, cnt['Z']--,cnt['E']--,cnt['R']--,cnt['O']--;
	while(cnt['G']) ret[8]++, cnt['E']--,cnt['I']--,cnt['G']--,cnt['H']--,cnt['T']--;
	while(cnt['H']) ret[3]++, cnt['T']--,cnt['H']--,cnt['R']--,cnt['E']--,cnt['E']--;
	while(cnt['W']) ret[2]++, cnt['T']--,cnt['W']--,cnt['O']--;
	while(cnt['R']) ret[4]++, cnt['F']--,cnt['O']--,cnt['U']--,cnt['R']--;
	while(cnt['X']) ret[6]++, cnt['S']--,cnt['I']--,cnt['X']--;
	while(cnt['S']) ret[7]++, cnt['S']--,cnt['E']--,cnt['V']--,cnt['E']--,cnt['N']--;
	while(cnt['F']) ret[5]++, cnt['F']--,cnt['I']--,cnt['V']--,cnt['E']--;
	while(cnt['I']) ret[9]++, cnt['N']--,cnt['I']--,cnt['N']--,cnt['E']--;
	while(cnt['O']) ret[1]++, cnt['O']--,cnt['N']--,cnt['E']--;
	
	FOR(i,10) while(ret[i]--) _P("%d",i);
	_P("\n");
}

まとめ

コピペの際スペルミスとかタイプミスして変に手間取った。