排序检索-123 quick searching

来源:互联网 发布:深圳有名的公司 知乎 编辑:程序博客网 时间:2024/06/08 17:50

题目大意:给出忽略词和标题们,在标题中过滤忽略词,剩下的就是关键词,根据关键词的字母排序输出标题,要求除了关键词是大写的,其他单词都是小写,一条标题有多个关键词要分别输出,一条标题有两个相同的关键词当成是不同的关键词输出。

解题过程:这道题RE了无数次,开始是以为自己的数组开小了,后来发现是qsort问题,qsort不能用于给string数组排序,于是自己编了一个cmp和sort函数

正确代码:

# include <cstdio># include <cstdlib># include <ctime># include <cmath># include <iostream># include <fstream># include <cstring># include <string>//*#define fin cin#define fout cout//*/using namespace std;/*ifstream fin("in.txt");ofstream fout("out.txt");//*/int cmp (const void*a,const void* b){string sa=*(string*)a;string sb=*(string*)b;for(int i=0;i<min(sa.length(),sb.length());i++){if(sa[i]<sb[i]) return -1;if(sb[i]<sa[i]) return 1;}if(sa.length()<sb.length()) return -1;if(sa.length()>sb.length()) return 1;return 0;}char* transf(string a){char * s=new char[a.length()];for(int i=0;i<a.length();i++){s[i]=a[i]-32;}s[a.length()]='\0';return s;}void sort(string* a,int num){string temp="";for(int i=0;i<num;i++){for(int j=num-1;j>=i;j--){if(cmp(&(a[i]),&(a[j]))>0){temp=a[i];a[i]=a[j];a[j]=temp;}}}}struct titles{int numofkw,numofword;string word[20];string kw[20];int posofkw[20];titles(){numofkw=numofword=0;memset(posofkw,-1,sizeof(posofkw));}void addword(string a){word[numofword++]=a;}void getkw(string* ignore,int numofignore,string* keyw,int& numofkeyw){for(int i=0;i<numofword;i++){//fout<<"待查找单词为:"<<word[i]<<": ";bool isfound=false;for(int j=0;j<numofignore;j++){//fout<<"当前比对的ignore为:"<<ignore[j]<<endl;if(word[i]==ignore[j]){isfound=true;//fout<<"是被忽略单词。"<<endl; break;}}if(isfound) continue;else {//fout<<"是关键字。"<<endl;posofkw[numofkw]=i;kw[numofkw]=word[i];numofkw++;isfound=false;for(int j=0;j<numofkeyw;j++){if(word[i]==keyw[j]){isfound=true;break;}}if(!isfound){keyw[numofkeyw++]=word[i];}} }}int  find(string s){int pos=-1;for(int i=0;i<numofkw;i++){if(s==kw[i]) {pos=posofkw[i];for(int j=0;j<pos;j++){fout<<word[j]<<" ";}fout<<transf(word[pos]);for(int j=pos+1;j<numofword;j++){fout<<" "<<word[j];}fout<<endl;}}return pos;}};string ignore[60];string kw[300];char temp[10005];titles title[205];int main(){int numofignore=0,numoftitles=0,numofkw=0;string a="";while(fin>>a&&a!="::"){ignore[numofignore]=a;numofignore++;}/*/fout<<"忽略"<<numofignore<<"  ";for(int i=0;i<numofignore;i++) fout<<ignore[i]<<" ";fout<<endl;//*/sort(ignore,numofignore);fin.getline(temp,10000);while(fin.getline(temp,10000)){for(int i=0;i<strlen(temp);i++){temp[i]=tolower(temp[i]);}a="";for(int i=0;i<strlen(temp);i++){if(temp[i]==' '){title[numoftitles].addword(a);a="";}else {a=a+temp[i];}} title[numoftitles].addword(a);title[numoftitles].getkw(ignore,numofignore,kw,numofkw);      /*        fout<<"第"<<numoftitles<<"句话:";for(int i=0;i<title[numoftitles].numofword;i++){fout<<title[numoftitles].word[i]<<" ";} fout<<endl;fout<<"其中关键字: "<<endl;for(int i=0;i<title[numoftitles].numofkw;i++){fout<<title[numoftitles].kw[i]<<" ";} fout<<endl;//*/numoftitles++;}sort(kw,numofkw);/*fout<<"关键字:"<<numofkw<<" ";for(int i=0;i<numofkw;i++) fout<<kw[i]<<" ";fout<<endl;//*/for(int i=0;i<numofkw;i++){for(int j=0;j<numoftitles;j++){title[j].find(kw[i]);} }return 0; }   

0 0
原创粉丝点击