解题报告:题目大意是输入两个数N和M,N表示一开始输入N个字符串,并且保存起来,然后再输入M个字符串,并且在输入M个字符串的同时要求判断每次输入的字符串是否已经存在,要注意的是后面输入的M个字符串每次输入之后如果判断不存在的话,还要把输入的这个字符串保存起来。
第一个用STL map容器过的题,纪念一下。看到这题之后,也许很多人都会想到用字典树,但我试过了 ,这题的输入的数据量比较大,如果用字典树就会超内存,于是这题又被我搁置了很久,直到我学了STL ,才发现,如果这题用map容器就是一个水题。前面输入的N个字符串只要一次插入到容器中就行了,后面输入M个字符串时,没输入一次就判断一次,在map容器中是否已经存在这个字符串。另外这题有一个很重要的点就是不能用cin或cout输入或输出,刚开始用我就TLE了,后来改 一下,把输入改成scanf,结果还是TLE,但是后来cout改成printf之后就过 了,瞬间少用了几百毫秒的时间,越来越感觉cin和cout不是一般地慢了。

1 #include<cstdio> 2 #include<map> 3 #include<string> 4 using namespace std; 5 int main() { 6 int N,M; 7 while(scanf("%d%d",&N,&M)!=EOF) { 8 string name; 9 char c[1000]; 10 map<string,int> map1; 11 for(int i = 1;i<=N;++i) { 12 scanf("%s",c); 13 name = c; 14 map1.insert(pair<string,int> (name,i)); 15 } 16 pair<map<string,int>::iterator,bool> iter; 17 for(int i = 1;i<=M;++i) { 18 scanf("%s",c); 19 name = c; 20 iter = map1.insert(pair<string,int> (name,N+i)); 21 if(iter.second) 22 printf("YES "); 23 else printf("NO "); 24 } 25 } 26 return 0; 27 }