#include #include #include #ifdef USE_HASH_MAP #ifdef __GNUC__ #include #define TR1EXT ::__gnu_cxx:: #define TR1_BEGIN namespace __gnu_cxx { #define TR1_END } #elif defined(_MSC_VER) #include #define TR1EXT _STDEXT #define TR1_BEGIN _STDEXT_BEGIN #define TR1_END _STDEXT_END #else #include #define TR1EXT ::tr1:: #define TR1_BEGIN namespace tr1 { #define TR1_END } #endif #define MAPTYPE TR1EXT hash_map #else #include #define MAPTYPE std::map #endif #include #define NSTATES 50 char *states[NSTATES] = { "alabama", "alaska", "arizona", "arkansas", "california", "colorado", "connecticut", "delaware", "florida", "georgia", "hawaii", "idaho", "illinois", "indiana", "iowa", "kansas", "kentucky", "louisiana", "maine", "maryland", "massachusetts", "michigan", "minnesota", "mississippi", "missouri", "montana", "nebraska", "nevada", "newhampshire", "newjersey", "newmexico", "newyork", "northcarolina", "northdakota", "ohio", "oklahoma", "oregon", "pennsylvania", "rhodeisland", "southcarolina", "southdakota", "tennessee", "texas", "utah", "vermont", "virginia", "washington", "westvirginia", "wisconsin", "wyoming", }; typedef std::vector IntVector; typedef std::pair IntPair; typedef std::vector IntPairVector; #if defined(USE_HASH_MAP) TR1_BEGIN size_t hash_value(const IntVector& v) { size_t hash=v.size(); for (IntVector::const_iterator i= v.begin() ; i!=v.end() ; ++i) { hash <<= 1; hash ^= *i; } return hash; } #ifdef __GNUC__ template<> struct hash { inline size_t operator()(const IntVector& v) const { return hash_value(v); } }; #endif TR1_END #endif typedef MAPTYPE sigmap_t; void add_to_sig(IntVector& sig, const std::string& str) { for (std::string::const_iterator i= str.begin() ; i!=str.end() ; i++) sig[(*i)-'a']++; } bool test(bool bOutput) { sigmap_t sigmap; for (int i= 0 ; i1) { IntPairVector& p= (*k).second; if (bOutput) { std::cout << states[p[0].first] << ":" << states[p[0].second] << "\n"; std::cout << states[p[1].first] << ":" << states[p[1].second] << "\n"; } return true; } } return false; } int main(int argc, char **argv) { for (int i=0 ; i<1000 ; i++) test(false); }