题目来源:
luogu.com.cn/problem/P1308
说明/提示
【数据范围】
1 <= 单词长度 <= 10。
1 <= 文章长度 <= 1,000,000。
题解(仅供参考)
#include #include using namespace std; //使用std命名空间string w, s; //定义两个字符串 int main() { getline(cin, w); //读入一行单词 getline(cin, s); //读入一行文章(可读入空格) int len_w = w.length(); //单词字符串长度 int len_s = s.size(); //文章字符串长度(两种方法都可) for (int i=0; i//单词中小写字母全部转换为大写(大写转小写也可) if (w[i]>='a' && w[i]<='z') { w[i] -= ('a' - 'A'); } } for (int i=0; i//文章中小写字母全部转换为大写 if (s[i]>='a' && s[i]<='z') { s[i] -= 32; } } int cnt = 0, pos = 0, fir_pos = -1; //cnt单词在文章中出现的次数 bool flag = true; while (pos pos = s.find(w, pos); //从s[pos]开始查找w在s中第一次出现时的位置 if (string::npos == pos) { //如果没有找到,则返回 string::npos break; } //匹配单词时,要求完全匹配,如果给定单词仅是文章中某一单词的一部分则不算匹配 if ((-1==pos-1 || ' '==s[pos-1]) && (len_s==pos+len_w || ' '==s[pos+len_w])) { if (flag) { fir_pos = pos; //保留第一次出现的位置 flag = false; //保证if语句只执行一次 } cnt++; //完全匹配,计数器加一 pos += len_w; //往后移动一个单词位置,继续下一次查找 } else { pos += len_w; //不完全匹配,继续往后查找 } } if (flag) { //如果单词在文章中没有出现,则直接输出一个整数-1 cout << fir_pos << endl; } else { cout << cnt << " " << fir_pos << endl; } return 0;}
NOIP2011普及组第2题