解いた問題のソースコードと解説など。


POJ 2341 Spell Checker

問題

アルファベットと.,;:-!?とスペースからなる文章が与えられる.文の区切りは.か!か?である.文章中の不整合な箇所の個数を答えよ.
ただし不整合なケースとは以下の2種類を指す.

  1. 文頭が大文字でない
  2. 単語の途中に大文字がある
やりかた

文意を正確に汲み取る必要がある.
注意するのは以下のケース.

  1. 文頭が記号である場合はその次の文字を文頭として見る
  2. 単語中に記号がある場合は単語の区切りとみなす
  3. 改行は単語の区切りとみなす

以下ソース.

int main(){
  char c;
  bool s_start = true, w_start = true;
  int cnt = 0;

  while((c = getchar()) != -1){
    if(c == '\n'){
      w_start = true;
    }
    else if(c == '.' || c == '?' || c == '!'){
      s_start = w_start = true;
    }
    else if(c == ' ' || c == ':' || c == ',' || c == '-'){
      w_start = true;
    }
    else{
      if(s_start && w_start){

	if(!isalpha(c)) continue;
	if(islower(c)) cnt++;
	
	s_start = w_start = false;
	
      }else if(!s_start && w_start){

	s_start = w_start = false;
	
      }else if(!s_start && !w_start){

	if(isupper(c)) cnt++;
	
      }
    }
  }
  cout << cnt << endl;
  return 0;
}
罪を憎んで人は憎まずにセクシー