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