OpenJudge2974

做这题的时候没上网看, 看了题目第一反应就是用map容器来做,

遗憾的是, 我完全不懂map容器, 看了一下书的介绍, 知道了一点点就开始试验一下,

开始做运行答案也正确(至少我自己的试验过的数据都能按要求输出),

可惜的是, 提交后狂TLE, 一开始是1050ms, 我就改改 谁知道悲剧事情又来了, 改了以后1200, 更是无语了。

后来看了网上那些人的代码, 找到几个是用c做的, 我打算坚持自己的map容器方法来做, 毕竟这样少了排序阶段。

发现有人说 sprintf 比 cin输出大概快100ms, 然后改了, 改了就过了 。

 

虽然不是最精炼的代码, 用时620ms, 我没怎么改了, 所以这个就是个比较烂的代码。

留着到时看到比较好的代码回来再改。

 

如果有人回我博客提出它宝贵的意见, 我感激不尽啊!

 

一下是我的代码:

 

 

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <cstdio>

using namespace std; 

void del(string &s)
{
	char c[9];
	int i, j;
	int table[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};

	for(i=0, j=0; i<s.size(); i++)
	{
		if(s[i]!='-')
		{
			if(s[i]>='A' && s[i]<='Z')
				c[j++] = table[s[i]-'A']+'0';
			else 		
				c[j++] = s[i];
		}
	}
	c[j]='\0'; 
	s = c;	
	s.insert(3, 1, '-'); 
}

int main()
{
	//ifstream in("OpenJudgeText.txt"); 
	
	int N, i, flat=0; 
	char c[100001];
	string s;
	map<string, int> list;
	map<string, int>::iterator it;

	scanf("%d", &N);
	while(N--)
	{
		scanf("%s", c);
		s = c;
		del(s);
		list[s]++;
		if(list[s] > 1)
			flat=1; 
	}
	if(flat == 0)
		printf("No duplicates.\n");
	else 
	{
		for(it=list.begin(); it!=list.end(); it++)
		{
			if(it->second > 1)
			{
				cout<<it->first;
				printf(" %d\n", it->second);
			}
		}
	}
	//cin>>i;
	return 0; 
}


 

你可能感兴趣的:(c,String,list,table,iterator)