kmjp's blog

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

Croc Champ 2013 - Qualification Round : A. Spyke Talks, B. Command Line Arguments

GCJの合間に、こんなのも出ております。
一応Round1も通過して次はRound2という状態。
この予選は、残念ながら本番中にEが解けず…。
http://codeforces.com/contest/291/problem/A
http://codeforces.com/contest/291/problem/B

A. Spyke Talks

複数の人があるIDを使って互いに通話している。
ID=0は通話をしてない状態であり、0以外で同じIDが3人以上いると混戦して通話にならない。
成立している通話の数を答える。

mapを使って2人同じIDがいる組み合わせを数えるだけ。
ID=0は複数人いてもいいのが忘れがち。

void solve() {
	int f,r,i,j,k,l,x,y;
	int ma=0;
	int N = GETi();
	map<int,int> M;
	
	FOR(i,N) {
		j=GETi();
		M[j]=M[j]+1;
	}
	
	f=0;
	for(map<int,int>::iterator mit=M.begin();mit!=M.end();mit++) {
		if(mit->first==0) continue;
		if(mit->second>2) {
			_P("-1\n");
			return;
		}
		if(mit->second==2) f++;
	}
	
	_P("%d\n",f);
	
	return;
}

B. Command Line Arguments

コマンドラインの文字列をパースする問題。
通常スペースは単語の区切りになるが、ダブルクォーテーションで囲まれた文はスペースがあっても良い。

ダブルクォーテーションの内外に気を付けて状態遷移を書いていくだけ。

void solve() {
	int f,r,i,j,k,l,x,y;
	char st[100002];
	gets(st);
	l=strlen(st);
	j=x=0;
	FOR(i,l) { //rem crlf
		if(j==0) {
			if(st[i]==' ') {
				if(x>0) _P(">\n");
				x=0;
			}
			else if(st[i]=='"') {
				_P("<");
				j=1;
			}
			else {
				if(x==0) _P("<");
				_P("%c",st[i]);
				x++;
			}
		}
		else {
			x=0;
			if(st[i]=='"') {
				_P(">\n");
				j=0;
			}
			else _P("%c",st[i]);
		}
	}
	if(j==0 && x>0) _P(">\n");
	return;
}

まとめ

どちらも落ち着いてやれば簡単な問題だけど、Aで問題文の読み落としをしてミスしたり、Bで出力にゴミが混ざって落とすなど、しょうもないミス連発。
これだから自分はTopCoderでEasyすらポロポロ落とすのだ…。