这道题就是给定 一系列ignore词(全部是小写),以::结尾 然后 输入一系列文本,每行不包括ignore词的作为关键词,(与ignore词比较不区分大小写) ,然后排序输出。每一行中可能出现几个关键词,那就以出现顺序先后输出,如果有几行包括了同一个关键词,就以输入时顺序输出,其余的按照字典序排序输出。输出的时候时候除了关键词大写外,其余都要小写。
这道题做的时候有点长,不过幸好1A。
我的思路是先把文本全部转化为小写,然后取出关键词,同时保存它的初始位置在哪一行以及在这一行出现的位置,然后对关键词排序,输出的时候把对应关键词做一个标记,为大写。对应输出就好。
#include<cstdio> #include<cstring> #include<ctype.h> #include<stdlib.h> struct node { char s[10000]; int index,p; }word[10000]; //存储关键词 初始在哪一行 在行中的位置 int cmp(const void* _a,const void* _b) { struct node* a=(node*)_a; struct node* b=(node*)_b; if(strcmp(a->s,b->s)==0&&a->index!=b->index) return a->index - b->index; else if(strcmp(a->s,b->s)==0&&a->index==b->index) return a->p - b->p; else return strcmp(a->s,b->s); } //先按 初始行下标排序,然后在按 位置排 最后按 字典序排 char s1[100][150]; //ignore char s2[250][10000]; //title char str[10000]; //临时保存关键词 bool ans[10000]; //标记数组 int main() { //freopen("a.txt","r",stdin); int n=0,m=0,i,j,x=0,jj; while(~scanf("%s",s1[n])) { if(strcmp(s1[n],"::")==0) break; n++; } getchar(); // for(i=0;i<n;i++) // printf("%s\n",s1[i]); while(gets(s2[m])) m++; for(i=0;i<m;i++) { int l=strlen(s2[i]); for(j=0;j<l;j++) { if(s2[i][j]>='A'&&s2[i][j]<='Z') s2[i][j]+=32; } } /* for(i=0;i<m;i++) { printf("%s\n",s2[i]); }*/ for(i=0;i<m;i++) { memset(str,'\0',sizeof(str)); int l=strlen(s2[i]),k=0,flag=0; //printf("%s\n",s2[i]); for(j=0;j<l;j++) { if(s2[i][j]>='a'&&s2[i][j]<='z') str[k++]=s2[i][j]; else { //printf("%s\n",str); flag=0; for(jj=0;jj<n;jj++) { if(strcmp(s1[jj],str)==0) {flag=1;break;} } if(!flag) { strcpy(word[x].s,str); word[x].index=i; word[x].p=j; x++; } memset(str,'\0',sizeof(str)); k=0; } } //printf("%s\n",str); flag=0; for(jj=0;jj<n;jj++) { if(strcmp(s1[jj],str)==0) {flag=1;break;} } if(!flag) { strcpy(word[x].s,str); word[x].index=i; word[x].p=j; x++; } memset(str,'\0',sizeof(str)); k=0; } qsort(word,x,sizeof(word[0]),cmp); // for(i=0;i<=x;i++) // printf("%s\n",word[i].s); for(i=0;i<x;i++) { int y=word[i].index; //printf("%d %d\n",y,word[i].p); memset(ans,0,sizeof(ans)); for(j=word[i].p-strlen(word[i].s);j<word[i].p;j++) ans[j]=1; //关键词标记 for(j=0;j<strlen(s2[y]);j++) if(ans[j]) printf("%c",s2[y][j]-32); else printf("%c",s2[y][j]); printf("\n"); } return 0; }
时间: 2024-10-10 08:03:40