POJ3349 Snowflake Snow Snowflakes

3 篇文章 0 订阅
3 篇文章 0 订阅

这是一道Hash题
说到hash,我们就想到了字符串
然后就想到了string
然后我就想到了之前我写的一篇博客:这好像称不上是博客
然后我们就想到了用basic_string做这道题
队形好评

虽然说非常简略,但是看了上面那一篇博客多少还是可以明白basic_string是个什么东西吧
看这里也可以

basic_string提供了一个封装形式的u32string,表示32位无符号整数的basic_string
在这道题中,我们用u32string储存每一片雪花,然后找到它的最小表示,最后再把它直接放进unordered_map里面——因为std::hash是有针对u32string的实现的!
但是代码还是打的好长啊

#include<cstdio>
#include<string>
#include<unordered_set>
#include<algorithm>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	unsigned x;
	unordered_set<u32string>q;
	while(n--)
	{
		u32string s,ss,ts,tts;
		for(int i=1;i<=6;i++)
		{
			scanf("%u",&x);
			s.push_back(x);
		}
		s+=s;
		
		int a=0,b=1,k=0;
		while(a<6&&b<6)//找最小表示(一开始用了暴力,代码更短,但是后来改了)
		{
			k=0;
			while(a+k<12&&b+k<12&&s[a+k]==s[b+k])k++;
			if(s[a+k]>s[b+k])a=a+k+1==b?a+k+2:a+k+1;
			else b=b+k+1==a?b+k+2:b+k+1;
		}
		if(a>5)ts=s.substr(b,6);//从s[b]开始长度为6的子串
		else ts=s.substr(a,6);
		
		reverse(s.begin(),s.end());//翻转它!
		
		a=0,b=1,k=0;
		while(a<6&&b<6)
		{
			k=0;
			while(a+k<12&&b+k<12&&s[a+k]==s[b+k])k++;
			if(s[a+k]>s[b+k])a=a+k+1==b?a+k+2:a+k+1;
			else b=b+k+1==a?b+k+2:b+k+1;
		}
		if(a>5)tts=s.substr(b,6);
		else tts=s.substr(a,6);
		
		if(q.find(ts)==q.end()&&q.find(tts)==q.end())
			q.insert(ts);
		else return puts("Twin snowflakes found."),0;
	}
	return puts("No two snowflakes are alike."),0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值