#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define NSIZ 1100
typedef struct Node_
{
char words[12][22];
char oldStr[256];
int time;
int index;
int wordsNum;
}Node;
Node art[NSIZ];
Node queryWords;
int titleCmp(const void * a, const void * b)
{
Node * aa = (Node *)a;
Node * bb = (Node *)b;
if (aa->time == bb->time)
{
return aa->index > bb->index?1:-1;
}
return aa->time < bb->time?1:-1;
}
//将源字符串分割成一个个单词
int findWordsInTitle(char * str, int n, int num, int type = 0)
{
if (!str || !n)
{
return -1;
}
int i = 0, flag = 0, j = 0, k = 0;
char tmpstr[256] = {0};
for (;i <= n; ++i)
{
if (isalpha(str[i]))
{
if (str[i] >= 'A' && str[i] <= 'Z')
{
tmpstr[j++] = str[i] + 32;
}
else
{
tmpstr[j++] = str[i];
}
flag = 1;
}
else if (flag)
{
tmpstr[j] = 0;
j = 0;
if (type == 0)
{
strcpy(art[num].words[k++], tmpstr);
}
else
{
strcpy(queryWords.words[k++] ,tmpstr);
}
flag = 0;
}
}
//for (i = 0;i < k;++i)
//{
// cout<<"== "<< art[num].words[i]<< " ";
//}
//cout<<"\n";
return k;
}
//将询问关键字在源字符串分割成单词词组中查找
int compareTwoTitles(Node title, Node word)
{
if (title.wordsNum < word.wordsNum)
{
return -1;
}
int i = 0, j = 0;
int wordNum = word.wordsNum;
int tNum = title.wordsNum;
for (i = 0;i < wordNum; ++i)
{
for (j = 0; j < tNum; ++j)
{
if (!strcmp(word.words[i], title.words[j]))
{
break;
}
}
if (j >= tNum)
{
break;
}
}
if (i == wordNum)
{
return 1;
}
else
{
return -1;
}
}
int main()
{
int t, i, m, j, n;
int num = 0;
while(scanf("%d", &t) != EOF && t)
{
num = 0;
memset(&art, 0, sizeof(art));
for (i = 0;i < t; ++i)
{
getchar();
gets(art[i].oldStr);
scanf("%d", &art[i].time);
n = strlen(art[i].oldStr);
num = findWordsInTitle(art[i].oldStr, n, i);
art[i].index = i;
art[i].wordsNum = num;
}
qsort(art, t, sizeof(art[0]), titleCmp);
scanf("%d", &m);
getchar();
for (i = 0;i < m; ++i)
{
memset(&queryWords, 0, sizeof(queryWords));
gets(queryWords.oldStr);
num = findWordsInTitle(queryWords.oldStr, n, i, 1);
queryWords.wordsNum = num;
for (j = 0; j < t; ++j)
{
if (compareTwoTitles(art[j], queryWords) != -1)
{
printf("%s\n", art[j].oldStr);
}
}
printf("***\n");
}
printf("---\n");
}
return 0;
}
hdu2532Engine 字符串模拟
最新推荐文章于 2025-08-23 09:52:07 发布

2101

被折叠的 条评论
为什么被折叠?



