#include #include char buf[100000], *suf[100000], orig[100000];; char res[100000]; char out[200000]; int bs; int os; char msg[20*1024]; int compar(char **aa, char **bb){ return(strcmp(*aa,*bb)); } char * search(char *w){ int hi, lo, mid, j, i; hi = bs-1; lo = 0; while (hi >= lo) { mid = lo+(hi-lo)/2; j = strcmp(w,suf[mid]); if (j) { if (j < 0) { hi = mid-1; }else{ lo = mid+1; } }else break; } for (i=0;suf[hi][i] && suf[hi][i] == w[i];i++){} strncpy(res,suf[hi]-buf+orig,i); res[i] = 0; for (i=0;suf[lo][i] && suf[lo][i] == w[i];i++){} if (i > strlen(res)){ strncpy(res,suf[lo]-buf+orig,i); res[i] = 0; } return res; } main(){ int i,j,k,c,nclip=0; gets(msg); while(EOF != (c = getchar())){ orig[bs] = c; buf[bs] = tolower(c); suf[bs] = buf+bs; bs++; } qsort(suf,bs,sizeof(char *),compar); for (i=0;msg[i];){ char *r; while (msg[i] && isspace(msg[i])) i++; if (!msg[i]) break; r = search(msg+i); strcat(out+os,r); strcat(out+os,"\n"); i += strlen(r); os += strlen(r); nclip++; } printf("%d\n",nclip); printf("%s",out); }