#include #include #include #include static struct { int a, b, c; } rules[128]; static size_t len; static size_t freq[26]; static struct Pairs { size_t _[26][26]; } pairs; static void step(void) { struct Pairs next = pairs; for (size_t i = 0; i < len; ++i) { size_t n = pairs._[rules[i].a][rules[i].b]; next._[rules[i].a][rules[i].c] += n; next._[rules[i].c][rules[i].b] += n; next._[rules[i].a][rules[i].b] -= n; freq[rules[i].c] += n; } pairs = next; } int main(void) { size_t cap = 0; char *buf = NULL; ssize_t n = getline(&buf, &cap, stdin); if (buf[n-1] == '\n') buf[n-1] = '\0'; freq[buf[0]-'A']++; for (size_t i = 0; buf[i+1]; ++i) { freq[buf[i+1]-'A']++; pairs._[buf[i]-'A'][buf[i+1]-'A']++; } char a, b, c; while (EOF != scanf(" %c%c -> %c\n", &a, &b, &c)) { rules[len].a = a - 'A'; rules[len].b = b - 'A'; rules[len].c = c - 'A'; len++; } for (int i = 0; i < 10; ++i) { step(); } size_t min = SIZE_MAX, max = 0; for (int i = 0; i < 26; ++i) { if (freq[i] && freq[i] < min) min = freq[i]; if (freq[i] > max) max = freq[i]; } printf("%zu\n", max - min); for (int i = 0; i < 30; ++i) { step(); } min = SIZE_MAX; max = 0; for (int i = 0; i < 26; ++i) { if (freq[i] && freq[i] < min) min = freq[i]; if (freq[i] > max) max = freq[i]; } printf("%zu\n", max - min); }