problem k: 查找某一个数_2011普及组T2:统计单词数

题目来源:

luogu.com.cn/problem/P1308

76d67ce854784ec161acf04060d17d56.png

说明/提示

【数据范围】

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题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值