#include #include #include #include using namespace std; struct State{ bool table[0x7e - 0x21]; int count; int from; State(int c, int f){ memset(table, 0, sizeof(table)); count = 1; table[c - 0x21] = true; from = f; } }; int main(){ static char buffer[1000 * 1000 + 2]; static char minimum[1000 * 1000 + 2]; int hoge = 0; while(true){ buffer[0] = '\0'; minimum[0] = '\0'; int length = 0; char line[80]; char pattern[80]; int minimum_len = 1<<29; int minimum_count = 0; while(true){ if(!gets(line)){return 0;} if(line[0] == '\0'){break;} strcat(buffer, line); } if(hoge++){printf("\n");} gets(pattern); length = strlen(buffer); int pattern_num = strlen(pattern); std::list states; for(int i = 0; i < length; i++){ //printf("buffer[%d] = %c\n", i, buffer[i]); for(int j = 0; j < pattern_num; j++){ if(buffer[i] == pattern[j]){ for(std::list::iterator k = states.begin(); k != states.end();){ if(!k->table[buffer[i] - 0x21]){ k->table[buffer[i] - 0x21] = true; k->count++; if(k->count == pattern_num){ if(i - k->from < minimum_len){ minimum_len = i - k->from; strncpy(minimum, buffer + k->from, i - k->from + 1); minimum[i - k->from + 1] = '\0'; minimum_count = 0; } if(minimum_len == i - k->from){ minimum_count++; } } } if(i - k->from >= minimum_len){ std::list::iterator temp = k; temp++; states.erase(k); k = temp; //printf("erase(temp)"); }else{ k++; } } states.push_back(State(buffer[i], i)); break; } } } printf("%d\n", minimum_count); for(int i = 0; i < strlen(minimum); i++){ if(i % 72 == 0){ printf("\n"); } printf("%c", minimum[i]); } if(strlen(minimum) != 0){ printf("\n"); } gets(buffer); } }