POJ 2337 【字典序】【欧拉回路】
2015-10-13 21:34
453 查看
题意:
给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排。
如果有多组解,输出字典序最小的一组解。
这题...
WA了两天。
错误有以下:
1.没有初始化好起始位置,默认起始位置是a了。想想想如果单词中都不带a开头的不就傻逼了吗。
2.没有理解好字典序,觉得只要保证每次都从尽量小的字母开始往下搜索就可以了,其实不然,我这样只是使得我下次找到的字母字典序最小而没有保证我本次找到的字母是字典序最小的。譬如若同时存在ab和aba我会优先搜索aba,但是事实上ab的字典序更小。
给你一些单词,判断这些单词能否在保证首尾单词相同的情况下连成一排。
如果有多组解,输出字典序最小的一组解。
这题...
WA了两天。
错误有以下:
1.没有初始化好起始位置,默认起始位置是a了。想想想如果单词中都不带a开头的不就傻逼了吗。
2.没有理解好字典序,觉得只要保证每次都从尽量小的字母开始往下搜索就可以了,其实不然,我这样只是使得我下次找到的字母字典序最小而没有保证我本次找到的字母是字典序最小的。譬如若同时存在ab和aba我会优先搜索aba,但是事实上ab的字典序更小。
#include<stdio.h> #include<string> #include<iostream> #include<algorithm> #include<string.h> #include<stack> #include<queue> #include<vector> using namespace std; int n; queue<string>pho[30]; bool ok[30]; int me[30]; int in[30]; int out[30]; string tmp[1010]; queue<int>jilu[30][30]; stack<int>s; int snum; int tmps[1050]; void dfs(int x) { s.push(x); if(!pho[x].empty()) { string meme=pho[x].front(); pho[x].pop(); dfs(meme[meme.length()-1]-96); } } int findme(int a) { if(a!=me[a]) return me[a]=findme(me[a]); return a; } void Fleury(int x) { snum=0; s.push(x); while(!s.empty()) { int b=0; if(!pho[s.top()].empty()) { b=1; } if(b==0) { tmps[snum++]=s.top(); s.pop(); } else { int y=s.top(); s.pop(); dfs(y); } } } int main() { int t; cin>>t; while(t--) { int start=9000; memset(ok,0,sizeof(ok)); for(int i=1; i<=26; i++) { me[i]=i; } while(!s.empty()) s.pop(); memset(out,0,sizeof(out)); memset(in,0,sizeof(in)); for(int i=1; i<=26; i++) { while(!pho[i].empty()) { pho[i].pop(); } for(int j=1; j<=26; j++) { while(!jilu[i][j].empty()) { jilu[i][j].pop(); } } } cin>>n; for(int i=1; i<=n; i++) { cin>>tmp[i]; } sort(tmp+1,tmp+1+n); for(int i=1; i<=n; i++) { if(start>min((int)tmp[i][0]-96,(int)tmp[i][tmp[i].length()-1]-96)) start=min((int)tmp[i][0]-96,(int)tmp[i][tmp[i].length()-1]-96); pho[tmp[i][0]-96].push(tmp[i]); jilu[tmp[i][0]-96][tmp[i][tmp[i].length()-1]-96].push(i); in[tmp[i][tmp[i].length()-1]-96]++; out[tmp[i][0]-96]++; ok[tmp[i][0]-96]=1; ok[tmp[i][tmp[i].length()-1]-96]=1; int tmpxx=findme((int)(tmp[i][0]-96)); int tmpyy=findme((int)(tmp[i][tmp[i].length()-1]-96)); if(tmpxx!=tmpyy) me[tmpyy]=tmpxx; } int x=0,y=0,z=0; for(int i=1; i<=26; i++) { if(ok[i]) { if(in[i]==out[i]) continue; else if(in[i]==out[i]+1) x++; else if(out[i]==in[i]+1) { y++; start=i; } else z++; } } int myt=0; for(int i=1; i<=26; i++) { if(ok[i]) { if(me[i]==i) myt++; } } //printf("%d %d %d %d\n",x,y,z,myt); if(z||myt>1) printf("***\n"); else if((y==1&&x==1)||(x==0&&y==0)) { Fleury(start); for(int i=snum-2; i>=0; i--) { cout<<tmp[jilu[tmps[i+1]][tmps[i]].front()]; jilu[tmps[i+1]][tmps[i]].pop(); if(i) printf("."); } printf("\n"); } else printf("***\n"); } }
相关文章推荐
- nexus5刷机
- [LeetCode-83] Remove Duplicates from Sorted List
- Linux MATLAB并行打不开问题的处理
- .NET环境下的DPAPI加密编程
- python中实现logistics回归
- 输出菱形
- 反射(java基础)
- 适配IOS9中间遇到的一些问题
- Ubuntu下添加程序快捷方式时出现复制时发生错误
- javaSE 学习笔记
- python中朴素贝叶斯代码的实现
- scala+play2.2.2+slick2.0.2 + mysql5.0整合之一基础环境搭建篇
- HDU 4739 Zhuge Liang's Mines
- 向界面研发掘金
- Android 工具类 —— 系统px 和 dp 的转换
- 使用Redis SETNX 命令实现分布式锁
- pyhon常用统计学实现
- Django Singal
- hdu 1513
- CentOS下编译安装Apache2(新)