/*
法一借鉴自bolg:http://blog.csdn.net/code4101/article/details/39587211
收获:
1. typedef定义数组类型,格式应为 typedef int int_array[80]; 此后int_array可作为有80个元素的int数组的简写
http://blog.csdn.net/huang_xw/article/details/8273655
2. 几个好用的define宏定义,简化代码
#define rep(i,b) for(int i=0; i<(b); i++)
#define foreach(i,a) for(__typeof((a).begin()) i=a.begin(); i!=(a).end(); ++i)
***注意:__typeof函数在英文前面,是2个_,不是一个_
同时学到了_typeof关键字的使用
http://blog.csdn.net/cx132123/article/details/6641735
3. 逗号表达式的返回值
概括就是:在C++中,逗号表达式有时候是一种很有用的工具:(A,B,C),则从左到右求值,最后C的(返回)值作为整个表达式的值
http://blog.csdn.net/songzitea/article/details/52177294
4. 还有就是,由于文章输入用的是getline,getline是能读取空串(整个串只有一个回车符)的,所以务必记得,输入n、m两个数字之后,都有getchar(),否则,轻则PE,重则WA
*/
#include
#include
#include
#include
/*
法二借鉴自:
http://blog.csdn.net/XieNaoban/article/details/52628860
和
https://github.com/morris821028/UVa/blob/master/temp/1597%20-%20Searching%20the%20Web.cpp
收获:
1. 如果对map的value,将其引用赋值给value的同类型,会比赋value值(map[key])的耗时少。
因为如果只是赋值,此后每次对value的操作,都需要从map里面重新查找。而如果赋引用,相当于是一劳永逸,只用查找一次,减少了STL的使用对程序速度的影响
详细的说法(本来写在注释中,现在单独剪切到收获中)
set &t = word_line[com[0]];
按照blog: http://blog.csdn.net/XieNaoban/article/details/52628860
中的分析,此处的引用,可谓是这个方法的神来之笔,使得运行速度大大减少
为什么能提高效率?
我的猜测:
按照RLJ曾在《入门经典》P123提到的:虽然map每次插入、查找和删除时间,和元素个数的对数呈线性关系;虽然map每次插入、查找和删除时间,和元素个数的对数呈线性关系;
但是,在一些对时间要求非常高的题目中,STL是有性能方面的瓶颈
而用LRJ的这两句总结,来分析这题,如果t前面不用引用,那么每次调用t时,都要从map中找到对应的单词应对应的集合,虽然map的查找尚算高效的了,但是,该代码在后来多次用到了t,只有将t设置为引用,才可以真正减少每次查找的时间消耗
实在巧妙!应该好好学习下这个小技巧,可在卡TLE的时候思索,怎么降低STL对速度的影响
2. 有关set的详细总结:
http://blog.csdn.net/howardemily/article/details/53573427
3. 十分保险的清楚缓存的方式
while (getchar() != '\n');
这种情况下,不仅清除掉多余的空格,甚至如果空格之前有多余的空白字符,也一并清除掉,使得不影响下一次的有效输入
4. 利用位运算的与和或,代替逻辑运算的与和或
这点不详细解释了,注意观察代码中out的定义方式,和更改方式(就是有out的地方,都重点关注一下,就能发现是怎么用位运算代替逻辑运算的)
但是要注意:我猜博主之所以要这样代替,是因为,有 |= 和 &= 运算符,但是,&&= 和 ||= 运算符是不存在的,所以是为了书写的简化了
换成逻辑运算我试过了,也没问题,但是此时,就必须把 out放到有值中,一起进行逻辑与/逻辑或了
*/
#include
#include
#include
#include