#include #include #include #define MAX_SLOVO 5000 int c, k, d; unsigned char slovo[MAX_SLOVO]; struct uzel { int pocet; struct uzel *potomci[255]; unsigned char znak; }; struct uzel * trie_uzel(char znak) { struct uzel *u = malloc(sizeof(struct uzel)); u->znak = znak; u->pocet = 0; for (unsigned char i='a'; i<='z'; i++) { u->potomci[i] = NULL; } return u; } void trie_pridej(struct uzel *akt, unsigned char *slovo) { int i = 0; do { if (!akt->potomci[slovo[i]]) akt->potomci[slovo[i]] = trie_uzel(slovo[i]); akt = akt->potomci[slovo[i]]; } while (slovo[++i]); akt->pocet++; } void trie_smaz(struct uzel *koren) { for (unsigned char i='a'; i<='z'; i++) { if (koren->potomci[i]) trie_smaz(koren->potomci[i]); } free(koren); } void trie_spoj_(struct uzel *cil, struct uzel *akt, unsigned char *buffer, int hloubka) { buffer[hloubka] = akt->znak; if (akt->pocet) { buffer[hloubka+1] = 0; trie_pridej(cil, buffer); } for (unsigned char i='a'; i<='z'; i++) { if (akt->potomci[i]) trie_spoj_(cil, akt->potomci[i], buffer, hloubka+1); } } void trie_spoj(struct uzel *koren1, struct uzel *koren2) { unsigned char buffer[MAX_SLOVO]; for (unsigned char i='a'; i<='z'; i++) { if (koren2->potomci[i]) trie_spoj_(koren1, koren2->potomci[i], buffer, 0); } } int trie_spocitej_(struct uzel *akt, int hloubka, int hlasu) { if (hlasu + akt->pocet >= k) return pow(26, d-hloubka); int pocet = 0; for (unsigned char i='a'; i<='z'; i++) { if (akt->potomci[i]) pocet += trie_spocitej_(akt->potomci[i], hloubka+1, hlasu+akt->pocet); } return pocet; } int trie_spocitej(struct uzel *koren) { return trie_spocitej_(koren, 0, 0); } int main(void) { scanf("%d%d%d", &c, &k, &d); struct uzel *trie_komise = trie_uzel(0); for (int i=0; i