%{
#include <stdio.h>
#include <string.h>
#define MAX_WORDS 1000
#define WORD_LEN 50
char words[MAX_WORDS][WORD_LEN];
int counts[MAX_WORDS];
int wordIndex = 0;
int search_word(const char *word) {
for (int i = 0; i < wordIndex; ++i)
if (strcmp(words[i], word) == 0)
return i;
return -1;
}
%}
%%
[ \n\t]+ ;
[a-zA-Z0-9_]+ {
int idx = search_word(yytext);
if (idx >= 0)
counts[idx]++;
else {
strcpy(words[wordIndex], yytext);
counts[wordIndex++] = 1;
}
}
. ;
%%
int main() {
yylex();
printf("\nHistogram of words:\n");
for (int i = 0; i < wordIndex; ++i)
printf("%s: %d\n", words[i], counts[i]);
return 0;
}
JXsKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2RlZmluZSBNQVhfV09SRFMgMTAwMAojZGVmaW5lIFdPUkRfTEVOIDUwCgpjaGFyIHdvcmRzW01BWF9XT1JEU11bV09SRF9MRU5dOwppbnQgY291bnRzW01BWF9XT1JEU107CmludCB3b3JkSW5kZXggPSAwOwoKaW50IHNlYXJjaF93b3JkKGNvbnN0IGNoYXIgKndvcmQpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZEluZGV4OyArK2kpCiAgICAgICAgaWYgKHN0cmNtcCh3b3Jkc1tpXSwgd29yZCkgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gLTE7Cn0KJX0KCiUlClsgXG5cdF0rICAgICAgICAgICAgICAgIDsKW2EtekEtWjAtOV9dKyAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBzZWFyY2hfd29yZCh5eXRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZHggPj0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW2lkeF0rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KHdvcmRzW3dvcmRJbmRleF0sIHl5dGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1t3b3JkSW5kZXgrK10gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICB9Ci4gICAgICAgICAgICAgICAgICAgICAgIDsKJSUKCmludCBtYWluKCkgewogICAgeXlsZXgoKTsKICAgIHByaW50ZigiXG5IaXN0b2dyYW0gb2Ygd29yZHM6XG4iKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZEluZGV4OyArK2kpCiAgICAgICAgcHJpbnRmKCIlczogJWRcbiIsIHdvcmRzW2ldLCBjb3VudHNbaV0pOwogICAgcmV0dXJuIDA7Cn0K