#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <type_traits>
#include <sstream>
#include <string>
#include <map>
#include <cmath>
using namespace std;
class Word
{
public :
std:: string Token;
int Count;
Word ( const std:: string & token, int count)
: Token( token) , Count( count) { }
} ;
int main ( )
{
std:: map < std:: string , int > FileA;
std:: map < std:: string , int > FileB;
//Read the input faking a ifstream...
std:: string file;
std:: getline ( std:: cin ,file) ;
std:: stringstream ssa ( file) ;
while ( ssa.good ( ) )
{
std:: string token;
ssa >> token;
++ FileA[ token] ;
}
std:: getline ( std:: cin ,file) ;
std:: stringstream ssb ( file) ;
while ( ssb.good ( ) )
{
std:: string token;
ssb >> token;
++ FileB[ token] ;
}
std:: vector < Word> intersection;
for ( auto i = FileA.begin ( ) ; i ! = FileA.end ( ) ; ++ i)
{
auto bentry = FileB.find ( i- > first) ; //Look up the word from A in B
if ( bentry == FileB.end ( ) )
{
continue ; //The word from file A was not in file B, try the next word
}
//We found the word from A in B
intersection.push_back ( Word ( i- > first,std:: min ( i- > second,bentry- > second) ) ) ; //You can replace the std::min call with whatever method you want to qualitate "most common"
}
//Now sort the intersection by Count
std:: sort ( intersection.begin ( ) ,intersection.end ( ) , [ ] ( const Word & a, const Word & b) { return a.Count > b.Count ; } ) ;
for ( auto i = intersection.begin ( ) ; i ! = intersection.end ( ) ; ++ i)
{
std:: cout << ( * i) .Token << ": " << ( * i) .Count << std:: endl ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxjbWF0aD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY2xhc3MgV29yZAp7CnB1YmxpYzoKICAgIHN0ZDo6c3RyaW5nIFRva2VuOwoJaW50IENvdW50OwoKCVdvcmQgKGNvbnN0IHN0ZDo6c3RyaW5nICZ0b2tlbiwgaW50IGNvdW50KQoJCTogVG9rZW4odG9rZW4pLCBDb3VudChjb3VudCkge30KfTsKaW50IG1haW4gKCkKewoJc3RkOjptYXA8c3RkOjpzdHJpbmcsIGludD4gRmlsZUE7CglzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBGaWxlQjsKCgkvL1JlYWQgdGhlIGlucHV0IGZha2luZyBhIGlmc3RyZWFtLi4uCglzdGQ6OnN0cmluZyBmaWxlOwoJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLGZpbGUpOwoJc3RkOjpzdHJpbmdzdHJlYW0gc3NhIChmaWxlKTsKCXdoaWxlIChzc2EuZ29vZCAoKSkKCXsKCQlzdGQ6OnN0cmluZyB0b2tlbjsKCQlzc2EgPj4gdG9rZW47CgkJKytGaWxlQVt0b2tlbl07Cgl9CgoJc3RkOjpnZXRsaW5lKHN0ZDo6Y2luLGZpbGUpOwoJc3RkOjpzdHJpbmdzdHJlYW0gc3NiIChmaWxlKTsKCXdoaWxlIChzc2IuZ29vZCAoKSkKCXsKCQlzdGQ6OnN0cmluZyB0b2tlbjsKCQlzc2IgPj4gdG9rZW47CgkJKytGaWxlQlt0b2tlbl07Cgl9CgoJc3RkOjp2ZWN0b3I8V29yZD4gaW50ZXJzZWN0aW9uOwoKCWZvciAoYXV0byBpID0gRmlsZUEuYmVnaW4oKTsgaSAhPSBGaWxlQS5lbmQgKCk7ICsraSkKCXsKCQlhdXRvIGJlbnRyeSA9IEZpbGVCLmZpbmQgKGktPmZpcnN0KTsgLy9Mb29rIHVwIHRoZSB3b3JkIGZyb20gQSBpbiBCCgkJaWYgKGJlbnRyeSA9PSBGaWxlQi5lbmQgKCkpCgkJewoJCQljb250aW51ZTsgLy9UaGUgd29yZCBmcm9tIGZpbGUgQSB3YXMgbm90IGluIGZpbGUgQiwgdHJ5IHRoZSBuZXh0IHdvcmQKCQl9CgoJCS8vV2UgZm91bmQgdGhlIHdvcmQgZnJvbSBBIGluIEIKCQlpbnRlcnNlY3Rpb24ucHVzaF9iYWNrKFdvcmQgKGktPmZpcnN0LHN0ZDo6bWluKGktPnNlY29uZCxiZW50cnktPnNlY29uZCkpKTsgLy9Zb3UgY2FuIHJlcGxhY2UgdGhlIHN0ZDo6bWluIGNhbGwgd2l0aCB3aGF0ZXZlciBtZXRob2QgeW91IHdhbnQgdG8gcXVhbGl0YXRlICJtb3N0IGNvbW1vbiIKCX0KCgkvL05vdyBzb3J0IHRoZSBpbnRlcnNlY3Rpb24gYnkgQ291bnQKCXN0ZDo6c29ydCAoaW50ZXJzZWN0aW9uLmJlZ2luKCksaW50ZXJzZWN0aW9uLmVuZCgpLCBbXShjb25zdCBXb3JkICZhLCBjb25zdCBXb3JkICZiKSB7IHJldHVybiBhLkNvdW50ID4gYi5Db3VudDt9KTsKCglmb3IgKGF1dG8gaSA9IGludGVyc2VjdGlvbi5iZWdpbiAoKTsgaSAhPSBpbnRlcnNlY3Rpb24uZW5kICgpOyArK2kpCgl7CgkJc3RkOjpjb3V0IDw8ICgqaSkuVG9rZW4gPDwgIjogIiA8PCAoKmkpLkNvdW50IDw8IHN0ZDo6ZW5kbDsKCX0KCglyZXR1cm4gMDsKfQ==