題目鏈接
這道題就是給定 一系列ignore詞(全部是小寫),以::結尾 然後 輸入一系列文本,每行不包括ignore詞的作為關鍵詞,(與ignore詞比較不區分大小寫) ,然後排序輸出。每一行中可能出現幾個關鍵詞,那就以出現順序先後輸出,如果有幾行包括了同一個關鍵詞,就以輸入時順序輸出,其余的按照字典序排序輸出。輸出的時候時候除了關鍵詞大寫外,其余都要小寫。
這道題做的時候有點長,不過幸好1A。
我的思路是先把文本全部轉化為小寫,然後取出關鍵詞,同時保存它的初始位置在哪一行以及在這一行出現的位置,然後對關鍵詞排序,輸出的時候把對應關鍵詞做一個標記,為大寫。對應輸出就好。
#include#include #include #include 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 ='A'&&s2[i][j]<='Z') s2[i][j]+=32; } } /* for(i=0;i ='a'&&s2[i][j]<='z') str[k++]=s2[i][j]; else { //printf("%s\n",str); flag=0; for(jj=0;jj