1. 程式人生 > >題解 NOIP2011 普及組 統計單詞數

題解 NOIP2011 普及組 統計單詞數

題目地址:https://www.luogu.org/problemnew/show/P1308

分析:

始終感覺這題有毒,因為官方提供的第一組資料,跑起來和我的結果不同,但是我卻AC了(實際上我認為它提供下載的資料是有問題的),另外我一直覺得那個題解部分的最高票答案有問題。。

其實還是一個比較簡單的題目,但是要注意坑:

  1.有可能出現的一個單詞是個空串;

  2.單次出現的位置是從0開始包含空格的,而不是這個單詞在文章中的位置;

  3.最後,測試資料末尾只有一個換行符,沒有'\r';

原始碼:

#include  <iostream>
#include  <string>
#include  <cstdio>
#include  <cstring>
using namespace std;
string s1, s2, s3;
int len = 0, pos = -1, cnt = 0, ans = 0, st = 0, ed = 0;
int main() {
	cin >> s1;
	int L = s1.size();
	for(int i = 0; i < s1.size(); i++) {
		s1[i] = tolower(s1[i]);
	}
	getchar();//吞掉上一行的換行符
	getline(cin, s2);//輸入文章
	len = s2.size();
	s3 = " ";
	s2.insert(len, s3);
	s2.insert(0, s3);
	//在首尾新增空格,用來判斷一個單詞的開始與結束
	len += 2;
	for(; ed < len; ) {
		if(s2[ed] == ' ' && st != ed) {
			pos++;
			if((ed - 1) - (st + 1) + 1 == L) {
				int i = st + 1;
				bool tag = true;
				for(int j = 0; j < L; j++) {
					s2[i + j] = tolower(s2[i + j]);//判斷當前單詞是否和給定的相同
					if(s2[i + j] != s1[j]) {
						tag = false;
						break;
					}
				}
				if(tag) {
					cnt++;
					if(cnt == 1) {
						ans = st;
					}
				}
			}
			st = ed;
		}
		ed++;
	}
	if(cnt > 0) {
		printf("%d %d\n", cnt, ans);
	} else {
		printf("-1\n");
	}
	return 0;
}