//
// Brute force solution to the challenge puzzle from the 4/1/2007
// edition of NPR's Morning Edition Sunday show with Will Shortz.
//

//
// The list of the fifty states, preprocessed to remove blanks and
// convert all upper case to lower case. 
//
char *states[50] =
{ 
"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",
};

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

int main()
{
    std::vector<char> letters[ 50 ][ 50 ];
    for ( int i = 0 ; i < 49 ; i++ )
        for ( int j = i + 1 ; j < 50 ; j++ ) {
            char *p = states[ i ];
            while (*p)
                letters[ i ][ j ].push_back( *p++ );
            p = states[ j ];
            while ( *p )
                letters[ i ][ j ].push_back( *p++ );
            std::sort( letters[ i ][ j ].begin(), letters[ i ][ j ].end() );
        }
    for ( int i = 0 ; i < 49 ; i++ )
        for ( int j = i + 1 ; j < 50 ; j++ ) {
           std::cout << i << " " << j << "    \r";
            for ( int m = 0 ; m < 49 ; m++ ) {
                if ( m == i || m == j )
                    continue;
                for ( int n = m + 1 ; n < 50 ; n++ ) {
                    if ( n == i || n == j )
                        continue;
                    if ( letters[ i ][ j ] == letters[ m ][ n ] )
                        std::cout << "\n"
                                  << states[ i ]
                                  << " "
                                  << states[ j ]
                                  << " "
                                  << states [ m ]
                                  << " "
                                  << states[ n ]
                                  << "\n";
                }
            }
        }
    return 0;
}

