UVA - 123 Searching Quickly 字符串处理

来源:互联网 发布:买家申请退款淘宝介入 编辑:程序博客网 时间:2024/06/14 02:10

题目大意;给你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 10010struct 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;}


0 0
原创粉丝点击