zoj - 3309- Search New Posts

5 篇文章 0 订阅
1 篇文章 0 订阅

题意:给一个操作和一个话题,操作有, new(加入新话题), reply(某话题置顶,同时当作新话题 ), tag(把某话题标记为旧话题), serach(从top到bottom输出前100个新话题)。

解法: 话题存在一个双向链表中(方便删除和插入), 每个话题名称映射一个链表的节点(用map),然后就是模拟。

坑点: 一个话题可以被tag多次,导致一开始访问了空指针(如果用链表做注意)。

//code

#include<iostream>
#include<cstdio>
#include<string>
#include<list>
#include<map>
using namespace std;


struct List{
	
	
	List *prev;
	List *next;
	string name;
	friend bool operator < (List a, List b)
	{
		return a.name<b.name;
	}
};


int main()
{
	int n;
	while(cin>>n)
	{
		map<string, List*>_m;
		map<string, List*>::iterator it;
		List *_l, *Head;
		Head = new List;
		_l = new List;
		_l->name = "Last";
		_l->next = NULL;
		_l->prev = Head;
		Head->next=_l;
		Head->name = "Head";
		Head->prev = NULL;
		for(int i=0; i<n; i++)
		{
			string tmp;
			cin>>tmp;
			if(tmp == "new")
			{
				
				
				cin>>tmp;
				List *_l_tmp;
				_l_tmp = new List;
				_l_tmp->name = tmp;
				
				
				_l_tmp->next = Head->next;
				_l_tmp->prev = Head;
				Head->next = _l_tmp;
				_l_tmp->next->prev = _l_tmp;
				
				
				
				
				_m.insert(map<string, List*>::value_type(_l_tmp->name, _l_tmp));
			}
			else if(tmp == "reply")
			{
				cin>>tmp;
				it = _m.find(tmp);
				
				if(it == _m.end()) continue;
				List *Prev, *Next;
				
				
				
				Prev = it->second->prev;
				Next = it->second->next;
				
				
				if(Prev != NULL && Next != NULL)
				{
					Prev->next = Next;
					Next->prev = Prev;
				}
				
				it->second->next = Head->next;
				it->second->prev = Head;
				Head->next = it->second;
				it->second->next->prev = it->second;
			}
			else if(tmp == "tag")
			{
				cin>>tmp;
				it = _m.find(tmp);
				if(it == _m.end()) continue;
				if(it->second->next == NULL && it->second->prev == NULL) continue;
				List *Prev, *Next;
				
				Prev = it->second->prev; 
				Next = it->second->next;
				
				Prev->next = Next;
				Next->prev = Prev;
				
				it->second->next = it->second->prev = NULL;
				
				
				
			}
			else if(tmp == "search")
			{
				List *q;
				q = Head->next;
				int Sum=0;
				while(q->next != NULL)
				{
					cout<<q->name<<endl;
					Sum++;
					if(Sum >= 100) break;
					q = q->next;
				}
				cout<<"###"<<endl;
			}
		}
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值