poj 1002 487-3279

现在开始刷poj的题,但是这题是有一次学校的contest上考过的,但是那次由于超时的问题,就没有A掉,这次刚敲完,还是受到了上次的影响还是超时,这时候实在想不明白就应该看discuss了,北大的discuss还是灰常给力,起码比起自己的Oj给力多了,自己oj基本没人讨论。。。后来发现自己用的优先队列是问题关键所在,对于这么大的一个储存数组,超时是难免的。后来还是得用纯数组来储存,节省比较时间。

第一个代码是TLE的错误代码,也就是我纠结很久的代码:

#include<cstdio>
#include<string>
#include<map>
#include<iostream>
#include<queue>
using namespace std;
struct node
{
	string num;
	int re;
	friend bool operator <(node a,node b)
	{
		return a.num>b.num;
	}
}qe[100005];
int main(void)
{
	int n;
	map<char,char> ma;
	char a[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y'};
	char b[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','8','8','8','9','9','9'};
	for(int i=0;i<24;i++)
		ma.insert(make_pair(a[i],b[i]));
	cin>>n;
		priority_queue<node> qq;
		int len=0;
		for(int i=0;i<n;i++)
		{
			string s;
			cin>>s;
			int x=0;
			string y;
			y="00000000";
			y[3]='-';
			for(int e=0;s[e]!='\0';e++)
			{
				if(s[e]=='-')
					continue;
				else if(s[e]>='A'&&s[e]<='Z')
				{
					y[x++]=ma[s[e]];
				}
				else
				{
					y[x++]=s[e];
				}
				if(x==3)
					x++;
			}
			int flag=0;
			for(int j=0;j<len;j++)
			{
				if(qe[j].num==y)
				{
					qe[j].re++;
					flag=1;
					break;
				}
			}
			if(!flag)
			{
				qe[len].num=y;
				qe[len++].re=1;
			}
		}
		for(int i=0;i<len;i++)
		{
			if(qe[i].re>=2)
			{
				qq.push(qe[i]);
			}
		}
		while(!qq.empty())
		{
			node xx=qq.top();
			qq.pop();
			cout<<xx.num<<' '<<xx.re<<endl;
		}
}


下面是看北大discuss大牛的回答后,改写的:

AC代码:

#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<iostream>
using namespace std;
int ar[10000000];
int main(void)
{
	int n;
	map<char,char> ma;
	char a[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','R','S','T','U','V','W','X','Y'};
	char b[]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7','7','7','8','8','8','9','9','9'};
	for(int i=0;i<24;i++)
		ma.insert(make_pair(a[i],b[i]));
	cin>>n;
	memset(ar,0,sizeof(ar));
	int Min=100000000;
	int Max=-1;
	for(int i=0;i<n;i++)
	{
		string s;
		cin>>s;
		int x=0;
		int sum=0;
		for(int e=0;s[e]!='\0';e++)
		{
			if(s[e]=='-')
				continue;
			else if(s[e]>='A'&&s[e]<='Z')
			{
				sum=sum*10+ma[s[e]]-'0';
			}
			else if(s[e]>='0'&&s[e]<='9')
			{
				sum=sum*10+s[e]-'0';
			}
		}
		ar[sum]++;
		int flag=0;
		if(sum>Max)
			Max=sum;
		if(sum<Min)
			Min=sum;
	}
	int flag=0;
	for(int i=Min;i<=Max;i++)
	{
		if(ar[i]>=2)
		{
			printf("%03d-%04d %d\n",i/10000,i%10000,ar[i]);
			flag=1;
		}
	}
	if(!flag)
		printf("No duplicates.\n");
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值