下解在杭电上内存超限过不去,牛客上可以,由于主要是练习map而不是hash,因此先不加深究
知识点:
i. map的find找不到的话返回值为map.end() find引用具有指定键的元素的位置的迭代器,如果找不到具有键的匹配项,则引用映射中 (map.end()) 最后一个元素后面的位置。
eg:
map<int,string> a;
a[1]="2";
map<int,string>::iterator it;
it=a.find(2);
if(it==a.end()) cout<<"!";
ii: getline(cin,input)用来输入含空格的字符串
iii: getline前如果有输入需要回车的话,务必要加个getchar()清除回车,否则就会被getline接收到\0,注意不是\n,
eg:
string a;
int N;
scanf("%d",&N);
while(N--)
{
string b;
getline(cin,b);
if(b=="\0") cout<<"!";
cout<<b<<endl;
}#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<string> using namespace std; int main() { string input;//字典输入 string end="@END@"; map<string,string> m; while(getline(cin,input))//存储字典 { if(input==end) break; //找到input的[魔咒]部分并存入magic string magic,function; int mag=input.find("]");//mag为]出现的下标 magic=input.substr(0,mag+1);//magic存放的为[魔咒]部分 //找到input的功能部分并存入function,其首字母在mag+2,尾字母在size-1 function=input.substr(mag+2,input.size()-1); m[magic]=function; m[function]=magic; } int N; scanf("%d",&N); getchar(); while(N--) { string find;//查找输入 getline(cin,find); string ans; map<string,string>::iterator it=m.find(find); if(it==m.end())//如果不存在 { cout<<"what?"<<endl; }else { string out=it->second; if(out.find("[")!=string::npos) { string outs=out.substr(1,out.size()-2); cout<<outs<<endl; }else cout<<out<<endl; } } }