#include #include using namespace std; struct entry { string key; int times; // number of times the wqord has been seen entry * nextsamehash; }; entry * search(string word, entry * list) { while (list != NULL) { if (list->key == word) return list; list = list->nextsamehash; } return NULL; } int length(entry * list) { int len = 0; while (list != NULL) { len += 1; list = list->nextsamehash; } return len; } int tablesize; entry * * table; int hash(string s) { int value = 78561; for (int i = 0; i < s.length(); i += 1) value = value * 691 + s[i]; if (value < 0) value = - value; return value % tablesize; } int main(int argc, char * argv[]) { tablesize = atoi(argv[1]); table = new entry * [tablesize]; for (int i = 0; i < tablesize; i += 1) table[i] = NULL; string inp; while (true) { cin >> inp; if (cin.eof()) break; int pos = hash(inp); cout << "hash=" << pos << ", "; entry * it = search(inp, table[pos]); if (it != NULL) it->times += 1; else { it = new entry; it->key = inp; it->times = 1; it->nextsamehash = table[pos]; table[pos] = it; } cout << "seen " << inp << " " << it->times << " times" << "\n"; } int count[21]; for (int i = 0; i < 21; i += 1) count[i] = 0; for (int i = 0; i < tablesize; i += 1) { int len = length(table[i]); if (len < 20) count[len] += 1; else count[20] += 1; } for (int i = 0; i < 21; i += 1) cout << i << ": " << count[i] << "\n"; }