hdu2532Engine 字符串模拟

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值