排序检索-123 quick searching

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

解题过程:这道题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;
 } 
 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值