UPC 2170 D Equal Is Not Really Equal (欧拉路径)

题目链接:http://acm.upc.edu.cn/problem.php?id=2170

题意:给出一个字符串,比如ABACA,在这个串里,AB、BA、AC、CA各出现一次。若存在另外一个串,里面也AB、BA、AC、CA各出现一次。我们称ABACA是不唯一的。给出一个串,判断其是不是唯一。

思路:将字母看做顶点,将相邻的连有向边。那么题 目转化成这个图是不是存在两条欧拉路径。现在这个图至少有一条欧拉路径。设原串最后一个字母对应的节点为end。那么现在的图中若存在一个点u,对于这个 u至少有两个节点v1,v2,使得存在<u,v1><u,v2>,并且删掉两个中的任意一条后end都可由u到达,则说明有两个 欧拉路径。我们现在假设u只有这两个子节点v1,v2,那么原来的欧拉回路必然是走的<u,v1>或者 <u,v2>,不妨是<u,v1>,那么对于u、v1、v2、end四个点的顺序大致有两种情况:
(1)u->v1->v2->u->v2->end
(2)u->v1->u->v2->end
那么对于边<u,v2>,若将其删除后,如能够到达end,那么只能是情况(1),此时两条欧拉路径除了(1)之外另一条是
u->v2->u->v1->v2->end。另外有一种情况上面的算法不能涉及,就是ABCDA,也就是前后两个是一样
的情况,这个必然是不唯一的,因为你存在了环,如BCDAB,CDABC等。

int a[30][30],d[30];
char s[N];
int n,end,flag;

int allSame()
{
    int i;
    FOR0(i,n) if(s[i]!=s[0]) return 0;
    return 1;
}

int h[30],last;

void DFS(int x)
{
    h[x]=1;
    int i;
    FOR0(i,26) if(!h[i]&&a[x][i]) DFS(i);
}

int OK(int x)
{
    clr(h,0);
    DFS(x);
    return h[last];
}

void deal()
{
    int cnt,i,j;
    FOR0(i,26) if(d[i]>1)
    {
        cnt=0;
        FOR0(j,26) if(a[i][j]>0)
        {
            a[i][j]--;
            if(OK(i)) cnt++;
            a[i][j]++;
        }
        if(cnt>1)
        {
            puts("not unique");
            return;
        }
    }
    puts("unique");
}

int main()
{
    rush()
    {
        RD(s); n=strlen(s);
        int i,j;
        clr(a,0); clr(d,0);
        FOR0(i,n-1)
        {
            a[s[i]-‘A‘][s[i+1]-‘A‘]++;
        }
        FOR0(i,26) FOR0(j,26) if(a[i][j]) d[i]++;
        if(!allSame()&&s[0]==s[n-1])
        {
            puts("not unique");
            continue;
        }
        last=s[n-1]-‘A‘;
        deal();
    }
    return 0;
}

UPC 2170 D Equal Is Not Really Equal (欧拉路径),布布扣,bubuko.com

时间: 2024-08-08 22:08:27

UPC 2170 D Equal Is Not Really Equal (欧拉路径)的相关文章

Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum

Scalaz是由一堆的typeclass组成.每一个typeclass具备自己特殊的功能.用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上.scala这个编程语言借鉴了纯函数编程语言Haskell的许多概念.typeclass这个名字就是从Haskell里引用过来的.只不过在Haskell里用的名称是type class两个分开的字.因为scala是个OOP和FP多范畴语言,为了避免与OOP里的type和class发生混扰,所以就用了typeclas

讨论JDK的File.equal()

我们一般比较两个文件中的对象是相同的文件,通常使用java.io.File.equal().这里,equal()是不是文件内容的比较结果为.象是否指向同一个文件. File的equal()方法.实际上调用了当前文件系统FileSystem的compareTo(). public boolean equals(Object obj) { if ((obj != null) && (obj instanceof File)) { return compareTo((File)obj) == 0

java equal和==的比较,尤其注意基本类型和基本类型的包装类型的比较

java中equals方法和"=="的区别: equals 方法是 java.lang.Object 类的方法. 有两种用法说明: (1)对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. "=="比较两个变量本身的值,即两个对象在内存中的首地址. "equals()"比较字符串中所包含的内容是否相同. 比如: String s1,s2,s3 = "abc&q

软件测试知识点汇总目录(持续更新)

个人在工作之余通过word文档长期持续更新工作中需要涉及到的一些理论和技术知识.所谓好记记性,不如乱笔头.根据工作年限和职位的变化,以及就职公司参与的产品或者项目所涉及到的测试方面的技能不一样,会存在有些之前的技能不经常使用,会导致生疏的现象.虽然不至于归零,但是一旦需要使用的时候,有一个相对比较完整规范的文档来应急阅读来回顾其使用等是很有帮助的.比在网上搜索出来的相关零散的不完整的知识点方便的多. 文档创建年限不是很长,有很多知识项没有写入文档或者还没有来得及编写,需要在后续持续更新.文档编写

mybatis中的mapper接口文件以及example类的实例函数以及详解

##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列. example.setDistinct(false)//去除重复,boolean型,true为选择不重复的记录. Criteria criteria = new Example().createCriteria(); is null;is not null; equal to(value);not equ

HashMap与TreeMap源码分析

1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Java这么久,也写过一些小项目,也使用过TreeMap无数次,但到现在才明白它的实现原理).因此本着"不要重复造轮子"的思想,就用这篇博客来记录分析TreeMap源码的过程,也顺便瞅一瞅HashMap. 2. 继承结构 (1) 继承结构 下面是HashMap与TreeMap的继承结构: pu

cocos2d::Vector

v3.0 beta加入 定义在"COCOS2DX_ROOT/cocos/base"的"CCVector.h"头文件中. template<class T>class CC_DLL Vector; cocos2d::Vector<T>是一个封装好的能动态增长顺序访问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中的标准顺序容器std::vector. 在Cocos2d-x v3.

[转]各种符号的英文单词

英文中有 "-",用作连词符,读hyphen, 还有就是长一点的 "--",作为破折号,读dash. etc.读作 et cetre符号"*"正解:asterisk通讯行业称呼“#”叫做:pound key(#是英镑的代号),称呼“*”叫做:star key,数字键叫做:number key就是在电子业 sharp 的解释是最不合适的,因为 # 在乐谱中标志升高半音,而 sharp 是“升高半音”的音乐英文术语. 在英式英语中读"hash",但是

iOS界面布局的核心以及TangramKit介绍

前言 TangramKit是iOS系统下用Swift编写的第三方界面布局框架.他集成了iOS的AutoLayout和SizeClass以及Android的五大容器布局体系以及HTML/CSS中的float和flex-box的布局功能和思想,目的是为iOS开发人员提供一套功能强大.多屏幕灵活适配.简单易用的UI布局解决方案.Tangram的中文即七巧板的意思,取名的寓意表明这个布局库可以非常灵巧和简单的解决各种复杂界面布局问题.他的同胞框架:MyLayout是一套用objective-C实现的界面