这是一道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;
}