题目大意;给你N个ignore的词,M个title,要求你找出每个title中除了ignore的词外的所有词,并按升序排序,最后输出每个找到的单词的title,输出格式是,输出该单词所在的title,除了该单词是大写外,所有单词都是小写
解题思路:字符串处理,挺麻烦的,注意空格
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
using namespace std;
#define maxn 55
#define maxm 210
#define maxd 10010
struct word{
int start,end,mark;
char str[maxd];
}w[maxd];
int cmp(const void *p1,const void *p2) {
return strcmp((*(word*)p1).str,(*(word*)p2).str);
}
char key_word[maxn][15],title[maxm][maxd];
int main() {
int cnt = 0,len,start,N = 0,count = 0;
for( ; ; cnt++) {
gets(key_word[cnt]);
if(key_word[cnt][0] == ':' && key_word[cnt][1] == ':')
break;
}
while(gets(title[count])) {
len = strlen(title[count]);
start = 0;
for(int i = 0; i <= len; i++) {
//遇到大写的就将其转换成小写的
if(title[count][i] >= 'A' && title[count][i] <= 'Z')
title[count][i] = title[count][i] + 32;
//如果title里面出现的空格,就判断是不是一个单词,如果是单词的话,就表示前一个字符不是空格
if( (title[count][i] == ' ' || title[count][i] == '\0' ) && i - 1 >= 0) {
if(title[count][i - 1] == ' ')
break;
int n = 0,mark = 1;
for(int j = start; j < i; j++) {
//判断前面是不是空格,如果是空格的话,就跳过
if(title[count][j] == ' ')
continue;
//找到第一不是空格的字符,那个字符就是开端
if(mark) {
mark = 0;
w[N].start = j;
}
//之后的话将每个字符返回
w[N].str[n] = title[count][j];
n++;
}
w[N].str[n] = '\0';
int j;
//判断是不是要忽略的关键词
for(j = 0; j < cnt; j++)
if(strcmp(w[N].str,key_word[j]) == 0)
break;
if(j == cnt) {
w[N].end = i;
w[N].mark = count;
N++;
}
start = i;
}
}
count++;
}
qsort(w,N,sizeof(w[0]),cmp);
for(int i = 0; i < N; i++) {
int len = strlen(title[w[i].mark]);
for(int j = 0; j < w[i].start; j++)
printf("%c",title[w[i].mark][j]);
for(int j = w[i].start; j < w[i].end; j++)
printf("%c",title[w[i].mark][j] - 32);
for(int j = w[i].end; j < len; j++)
printf("%c",title[w[i].mark][j]);
printf("\n");
}
return 0;
}