/* Wed Mar 17 00:21:57 JST 2004 */ #include #include #include #include #include #include char text[1000001]; char is_key[256]; deque codes[64]; map tops; int main() { char s[128]; int i, j, len, sol; int min_len, min_start, min_end, min_n; while (1) { for (i = 0; i < 64; i++) { codes[i].clear(); } sol = 0; while (1) { gets(&text[sol]); if (text[sol] == '\0') { break; } sol += strlen(&text[sol]); } if (text[0] == '\0') { break; } gets(s); len = strlen(s); for (i = 0; i < 256; i++) { is_key[i] = 0; } for (i = 0; i < len; i++) { is_key[s[i]] = i+1; } gets(s); // Dummy for (i = 0; i < sol; i++) { if (is_key[text[i]]) { codes[is_key[text[i]]-1].push_back(i); } } tops.clear(); for (i = 0; i < len; i++) { if (codes[i].empty()) { min_n = 0; goto quit; } tops.insert(make_pair(codes[i].front(), i)); } min_len = tops.rbegin()->first - tops.begin()->first + 1; min_start = tops.begin()->first; min_end = tops.rbegin()->first; min_n = 1; while (1) { int target = tops.begin()->second; int tmp_len; codes[target].pop_front(); if (codes[target].empty()) { break; } tops.erase(tops.begin()); tops.insert(make_pair(codes[target].front(), target)); tmp_len = tops.rbegin()->first - tops.begin()->first + 1; if (tmp_len < min_len) { min_len = tmp_len; min_start = tops.begin()->first; min_end = tops.rbegin()->first; min_n = 1; } else if (tmp_len == min_len) { min_n++; } } quit: printf("%d\n\n", min_n); if (min_n == 0) { continue; } for (i = min_start, j = 0; i <= min_end; i++, j++) { printf("%c", text[i]); if (j % 72 == 71) { printf("\n"); } } if (j % 72 > 0) { printf("\n"); } printf("\n"); } return 0; }