題解 NOIP2011 普及組 統計單詞數
阿新 • • 發佈:2019-01-26
題目地址: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; }