POJ3349 Snowflake Snow Snowflakes

mac2024-11-10  50

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