字符串|【日常学习】【字符串处理】noip2011普及组第2题 统计单词数题解

这又是一道成功加入“容易吗”系列的基础题= =原本很简单,可是我一开始太大意看错了题,以为是让输出该单词是第几个单词,实际上应该输出该单词的首字母在第几个位置;改过后只得了二十分,看了一组数据,原来第一个单词前面可以有前导空格——幸亏其他单词前没有,否则还真不知道怎么办;实现的时候又出了各种问题。于是我决定总结一下。
题目:
给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。

输入格式:
输入文件名为stat.in ,2 行。
第1 行为一个字符串,其中只含字母,表示给定单词;
第2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
输出文件名为stat.out 。
只有一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数-1。

1≤ 单词长度≤10。
1≤ 文章长度≤1,000,000。



二话不说,先上代码

//tongjidancigeshu #include #include #include//for tolower #include using namespace std; inline string change(string s){//wxjlzbcd神犇表示,加inline后变成内联函数,内联到宏中,可以稍微加速,暴搜可用,但是我不大了解,慢慢学习 for (int i=0; i

为防止大家看不懂我不标准的英文注释,代码注释采用中英双语= =
关于代码中提到的两点:
1.getline()
关于这一点,这里有一份相当好的资料,来自新浪博主sundowner,他在博客园也有博客
【字符串|【日常学习】【字符串处理】noip2011普及组第2题 统计单词数题解】原文地址:http://blog.sina.com.cn/s/blog_60263c1c0101ck25.html
作者博客园博客:http://www.cnblogs.com/overcode
作者所言如下:

学习C++的同学可能都会遇到一个getline()函数,譬如在C++premer中,标准string类型第二小节就是“用getline读取整行文本”。书上给的程序如下: int main() { string line: while(getline(cin,line)) cout<
也就是说,实际上函数为getline(流的名称,字符串名称,结束符)。鄙人第一次输入的时候忘了cin,后果相当严重啊···
再次感谢上文作者sundowner,我才知道sundowner意思是:流浪汉;无业游民;傍晚喝的饮料···
2.s.substr()
这个函数用于复制字符串的一段子串。
这个函数是针对STL的string类型的,c字符串是不可以用的!
这个函数str在后面,c字符串函数str基本都是在前面!
这个函数使用时前面一定要加字符串名,因为这是STL!
这个函数使用格式为:s.substr(起始位置(int),截取长度(int)),鄙人刚开始竟然用了s.begin()+pos···
更悲剧的是,鄙人看百科竟然看成了PHP中的substr TUT
只输入一个数字时,为起始位置,默认截取到字符串尾。
起始位置不可以是负数,否则···
codevs上大神的代码鄙人根本看不懂,但至少学习了一个函数s.erase 这个似乎是eraser来源的单词的意思是:清除,擦除
如果有谁有更好的方法,请务必与我交流,鄙人不胜感激。
——————————————————————
马年最后一天泡机房,今天上午来的时候想的是:听一下群的基础,只写作业不刷题。
但我看到洛谷排名鄙人终于进了前200且超过千反田妹妹后,不胜欣喜,于是忍不住刷了一道水题。
哪知这水题···好吧AC掉之后一看表十点五十···写完题解一看表十一点四十···
我马年最后一次机房的一上午,就这么栽倒在一道水题上
TUT OTZ _(:з」∠)_ 我已不知如何形容我此时澎湃的心潮(/?Д?)/((???|||))
——举头西北浮云,倚天万里须长剑。


    推荐阅读