传送门:http://poj.org/problem?id=2513

题意:给你许多木棍,木棍两端都有颜色,问能不能首尾相接,要求颜色相同。

参考:https://www.cnblogs.com/kuangbin/archive/2012/08/07/2626223.html

思路:

由图论知识可以知道,无向图存在欧拉路的充要条件为:

①     图是连通的;

②     所有节点的度为偶数,或者有且只有两个度为奇数的节点。

图的连通可以利用并查集去判断。

度数的统计比较容易。

数据比较大,首先需要将颜色的字符串和数字一一对应起来。

虽然可以用map,但是map效率不高,肯定会超时的。

最好的办法的是建立字典树。

将字符串和数字一一对应起来。

注意本题的数据有没有木棒的情况,要输出Possible。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <list>
#include <iterator> using namespace std; #define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back #define Pll pair<ll,ll>
#define Pii pair<int,int> #define fi first
#define se second #define OKC ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
typedef unsigned long long ull; /*-----------------show time----------------*/ const int tm = ;
int col = ;
struct trie{
trie* nxt[tm];
int last;
trie()
{
memset(nxt,,sizeof(nxt));
last = ;
}
}*root;
int insert(char *s)
{
trie * p = root;
for(int i=;s[i];i++)
{
if(!p->nxt[s[i] - 'a'])
p->nxt[s[i]-'a'] = new trie;
p = p->nxt[s[i]-'a'];
}
if(p->last)
return p->last;
else
{
col++;
return p->last = col;
}
}
const int maxn = 5e5+;
int deg[maxn];
int fa[maxn];
void init(){
for(int i=; i<maxn; i++)
fa[i] = i;
root = new trie;
}
int f(int x)
{
if(fa[x]==x)return x;
else return fa[x] = f(fa[x]);
}
void uni(int x,int y)
{
int px = f(x);
int py = f(y);
if(px==py)return ;
fa[px] = py;
}
int main(){
char s1[],s2[];
init();
while(~scanf("%s%s",s1,s2))
{
// if(s1[0]==s2[0])break;
int x = insert(s1),y = insert(s2);
uni(x,y);
deg[x]++;
deg[y]++;
}
int cnt1 = ,cnt2 = ;
for(int i=; i<=col; i++)
{
if(fa[i]==i)cnt1++;
if(deg[i]%==)cnt2++;
}
if((cnt1==||cnt1==)&&(cnt2==||cnt2==))
{
puts("Possible");
}
else puts("Impossible");
return ;
}

最新文章

  1. adb 命令
  2. 反汇编工具capstone安装后import error
  3. HDU 1568 double 快速幂
  4. UnityShader之固定管线Fixed Function Shader【Shader资料3】
  5. Odoo Entypo Regular Icon List
  6. PowerDesigner生成Oracle数据字典
  7. Photoshop CS4 启动弹出许可协议
  8. C# foreach 原理以及模拟的实现
  9. Android中Matrix的pre post set方法理解(转载来源:Linux社区 作者:zjmdp)
  10. sql存储过程通过ID删除两表中的数据。
  11. C语言基础06
  12. 业余写的一个播放器SDK,求点意见
  13. Android基础总结(精华完整版)
  14. UAC绕过思路(未完)
  15. phpcms总结(转)
  16. ubuntu 下修改文件访问权限chmod 777 -R *血的教训!没事别乱开权限!用谁开谁的就行。。。最后不要用这个命令,文件操作全部改用终端
  17. Vue相关开源项目库汇总
  18. 利用Python通过频谱分析和KNN完成iphone拨号的语音识别
  19. Spring -- 自定义转换器
  20. Linux内核剖析(三)构建源码树

热门文章

  1. 应用性能测试神器 Gatling,你用过吗?
  2. 实用小工具推荐 OpenWrite
  3. Netty+WebSocket 获取火币交易所数据项目
  4. [ PyQt入门教程 ] PyQt5基本控件使用:单选按钮、复选框、下拉框
  5. Wtm携手LayUI -- .netcore 开源生态我们是认真的!
  6. Apache 80端口可以访问,8080却不可访问
  7. Flink 源码解析 —— 源码编译运行
  8. Eclipse高级操作 远程调试
  9. 什么是HTML,HTML的简介,HTML结构
  10. Django Mysql数据库-F查询和Q查询