一、题目概述&样例
略
二、技巧
1、 由于索引没有顺序要求,使用unordered_map可以节省大量运行时间;
2、 一行内读取多个空格分割的字符串 由于cin不读取空格和换行,因此cin后在读取一个字符,根据字符为换行还是空格判断是否结束;
while( cin
>> str
)
{
map_book
[3][str
].push_back(ID
);
if( ( c
= getchar() ) == '\n' )
break;
}
3、 getline( cin, str );可以用于string格式获取整行;
4、使用getline易错点:
输入为:
2
BLABLABLABLA
若使用
scanf("%d", &N
);
getlin(cin
, str
);
则str中仅读取到换行符; scanf()读取整形应连换行一起读入:scanf("%d\n", &N);
5、map.find()找到匹配关键字返回指针,未找到时返回的指针指向map.end()
三、代码
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std
;
int main()
{
int N
, M
;
string str
;
scanf("%d", &N
);
unordered_map
<string
, vector
<int>> map_book
[6];
for( int i
= 0, ID
, y
; i
< N
; ++i
)
{
char c
;
scanf("%d\n", &ID
);
getline( cin
, str
);
map_book
[1][str
].push_back(ID
);
getline( cin
, str
);
map_book
[2][str
].push_back(ID
);
while( cin
>> str
)
{
map_book
[3][str
].push_back(ID
);
if( ( c
= getchar() ) == '\n' )
break;
}
getline( cin
, str
);
map_book
[4][str
].push_back(ID
);
getline( cin
, str
);
map_book
[5][str
].push_back(ID
);
}
scanf("%d\n", &M
);
for( int i
= 0, tag
; i
< M
; ++i
)
{
getline( cin
, str
);
tag
= str
[0] - '0';
cout
<< str
<< endl
;
str
.erase(str
.begin(), str
.begin() + 3);
if( map_book
[tag
].find(str
) == map_book
[tag
].end() )
printf("Not Found\n");
else
{
sort( map_book
[tag
][str
].begin(), map_book
[tag
][str
].end(), [] (int a
, int b
) { return a
< b
; } );
for( int i
= 0; i
< map_book
[tag
][str
].size(); ++i
)
printf("%07d\n", map_book
[tag
][str
][i
]);
}
}
}