map函数(解决一对一标记查询问题)

来源:互联网 发布:淘宝 原单店 编辑:程序博客网 时间:2024/05/23 01:19

Time Limit: 1000 MS    Memory Limit: 131072 K     

Description

There are two lists and they may be intersected with each other.You must judge if they are intersected and find the first node they have in common.

Input

The first line is the number of cases.Each case consists of two lists.Each list consists of multiple nodes.Each node is represented by its address in memory.So, a list may look like this: 0x233333 0x123456 0xabcdef1 0xffffff nilnil is the end of the list.All lists have no cycle.The length of list is not larger than 4e5.List can't be empty.Warn: huge input.

Output

"No" if they are not intersected."Yes Address", if they are intersected, print "Yes" and the address of their first common node.

Sample Input

20x233333 0x123456 0xabcdef1 0xffffff nil0x999999 0x332232 0xffffff nil0x233333 0x123456 0xabcdef1 0xffffff nil0x987654 0xafafaf 0xfffcccc 0xaaface nil

Sample Output

Yes 0xffffffNo

题解:最开始我想的是把这些输入用十六进制输入转化为int类型,后来发现根本行不通,因为需要开的数组太大了,后来大佬介绍用map函数轻松水过。所以去网上百度了一下,map函数:

map函数讲解:

1. map最基本的构造函数;
map<string ,int>mapstring; map<int,string >mapint;
map<sring,char>mapstring; map< char ,string>mapchar;
map<char,int>mapchar; map<int ,char>mapint;

2. map添加数据;

map<int ,string>maplive;
1. maplive.insert(pair<int,string>(102,"aclive"));
2. maplive.insert(map<int,string>::value_type(321,"hai"));
3. maplive[112]="April";//map中最简单最常用的插入添加!

3. map中元素的查找:

find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。

map<int ,string >::iteratorl_it;; 
l_it=maplive.find(112);//返回的是一个指针
if(l_it==maplive.end())
cout<<"we do not find112"<<endl;
elsecout<<"wo find112"<<endl;

 

map<string,string>m;

if(m[112]=="")

cout<<"we do not find112"<<endl;

4. map中元素的删除:
如果删除112;
map<int ,string>::iterator l_it;;
l_it =maplive.find(112);
if( l_it == maplive.end())
cout<<"we do not find112"<<endl;
else 
maplive.erase(l_it);//delete 112;

5. map中 swap的用法:
Map中的swap不是一个容器中的元素交换,而是两个容器交换;
For example:
#include<map>
#include<iostream>

usingnamespace std;

int main()
{
map <int, int> m1, m2, m3;
map <int,int>::iterator m1_Iter;

m1.insert( pair <int, int>(1, 10 ) );
m1.insert ( pair <int,int> ( 2, 20 ) );
m1.insert ( pair <int,int> ( 3, 30 ) );
m2.insert ( pair <int,int> ( 10, 100 ) );
m2.insert ( pair <int,int> ( 20, 200 ) );
m3.insert ( pair <int,int> ( 30, 300 ) );

cout << "The original map m1is:";
for ( m1_Iter = m1.begin( ) ; m1_Iter != m1.end() ; m1_Iter++ )
cout << " "<<m1_Iter->second;
cout << "."<< endl;

// This isthe member function version of swap
// m2 is said to be theargument map; m1 the target map
m1.swap( m2);

cout << "Afterswapping with m2, map m1 is:";
for ( m1_Iter = m1.begin( ) ; m1_Iter != m1.end() ; m1_Iter++ )
cout << " "<< m1_Iter ->second;
cout << "."<< endl;


cout << "After swapping with m2, mapm2 is:";
for ( m1_Iter = m2.begin( ); m1_Iter != m2.end(); m1_Iter++ )
cout << " "<< m1_Iter ->second;
cout << "."<< endl;


// This is the specialized template version of swap
swap( m1, m3 );

cout << "Afterswapping with m3, map m1 is:";
for ( m1_Iter = m1.begin( ); m1_Iter != m1.end(); m1_Iter++ )
cout << " "<< m1_Iter ->second;
cout << "."<< endl;
}

6. map的sort问题:
Map中的元素是自动按key升序排序,所以不能对map用sort函数:
For example:
#include<map>
#include<iostream>

usingnamespace std;

int main( )
{
map<int, int> m1;
map <int,int>::iterator m1_Iter;

m1.insert (pair <int, int> (1, 20 ) );
m1.insert ( pair<int, int> ( 4, 40) );
m1.insert ( pair<int, int> ( 3, 60) );
m1.insert ( pair<int, int> ( 2, 50) );
m1.insert ( pair<int, int> ( 6, 40) );
m1.insert ( pair<int, int> ( 7, 30) );

cout<< "The original map m1is:"<<endl;
for ( m1_Iter = m1.begin( );m1_Iter != m1.end( ); m1_Iter++ )
cout << m1_Iter->first<<""<<m1_Iter->second<<endl;

}

The original map m1 is:
1 20
2 50
3 60
4 40
6 40
7 30

7. map的基本操作函数:
C++Maps 是一种关联式容器,包含“关键字/值”对
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数

这一部分转载自:点击打开链接


然后是这道题的代码:

#include<cstdio>#include<map>#include<cstring>#include<string>#include<iostream>#include<algorithm>#include<vector>#include<cmath>using namespace std;int main(){    int T;    scanf("%d", &T);    while(T--)    {        map<string, int> mp; // string类型的指引, int类型的值        vector<string>v;        v.clear(); // 用之前要初始化        mp.clear();//同上        string s;        while(cin>>s && s!="nil")        {            mp[s] = 1;        }        while(cin>>s && s!="nil")        {            if(mp[s]==1)                v.push_back(s);        }        if(v.size()==0)            cout<<"No"<<endl;        else            cout<<"Yes "<<v[0]<<endl;    }    return 0;}


1 0
原创粉丝点击