#include <map>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <string> 
#include <fstream>
#include <iomanip>
#include <locale>
#include <vector>
#include <unordered_set>

struct alpha_only: std::ctype<char> {
    alpha_only() : std::ctype<char>(get_table()) {}

    static std::ctype_base::mask const* get_table() {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);
        for (int i=0; i<std::ctype<char>::table_size; i++)
            if (isalpha(i)) rc[i] = std::ctype_base::alpha;
        rc['\''] = std::ctype_base::alpha;
        return &rc[0];
    }
};

typedef std::pair<std::string, unsigned> count;

namespace std { 
    std::ostream &operator<<(std::ostream &os, ::count const &c) { 
        return os << std::left << std::setw(25) << c.first 
                    << std::setw(10) << c.second;
    }
}

int main(int argc, char **argv) { 
    std::locale loc(std::locale(), new alpha_only());
    for (int i=1; i<argc; ++i) {
        std::ifstream input(argv[i]);
        input.imbue(loc);

        std::map<std::string, unsigned> words;
    
        std::for_each(std::istream_iterator<std::string>(input),
                        std::istream_iterator<std::string>(),
                        [&words](std::string const &w) { ++words[w]; });
        std::copy(words.begin(), words.end(),
                    std::ostream_iterator<count>(std::cout, "\n"));
    }
    return 0;
}
