【Uva 11604 编码都有歧义了】
·你的目的就是要让编码有歧义,这就美妙了。
·英文题,述大意:
给出n个模板字符串,询问是否存在一个字符串,使得用模板串(随便你用多少个)来拼凑这个串,能够至少有两种拼法。如果有,就输出“有”。
·分析:
值得注意的是,n的范围不太大(0<n<101)。
如果直接思考如何拼凑,那么就是一个典型的搜索枚举思想,对于这道题来说,也是一个典型的爆炸超时思想。不过,如果拥有一个好的习惯,你会不禁想到:正着不行反着来。所以,我们考虑对于一个串,把它切成几块,并使得每块都属于模板串。如果有两种切法,那么就可以输出“Yes”了。
比如这样:

·目的明确。对于一个串,我们将其切割,我们在将这样的状态重画一遍:

·玩着玩着,我们意识到:分成的小段一定是属于模板串的。所以考虑用模板串去填出大串(逆向思维已经贡献了它的全部加值,现在应该回来了)。
·分析一类简单情况,如图,我们要拼凑满足条件的大串:

·首先会拿上面两个模板串,就拼出了大串。然后你会拿下面两个模板串再来拼一个一样的大串,然后就可以输出“Yes”了。
·在反复拼凑的过程中,得到一些结论:
①每种拼法每一个位置上的字母上一样的(不要忽视)
②不同的拼法,所使用模板串时,发现只有部分重叠(相同)的模板串能够在靠近的位置,如图:

·可以看见,红串绿串有公共前缀,在不同拼法中起点相同;黄串与蓝串有公共后缀,在不同拼法中终点相同;红串与黄串的关系是:红串的一个后缀等于黄串的一个前缀,它们在不同拼法中收尾相接(部分重叠)。你可以在冥冥之中感受到,两种拼凑方式是有联系的,即这个串可能会“指导”另一个串的合成。
·神秘跳跳方法解决问题。我们用这样的顺序,来搭建这两个串:(结合上图吧)先在上面放置一个绿串,然后在模板中寻找前缀与它相同的串来搭建下面的串,于是找到了红串,将红串放置。现在红串伸出去了一截,在模板中寻找前缀与这一截相同的串,找到黄串,放在上面。现在黄串伸出去了一截,在模板串中寻找前缀与这一截相同的串,找到蓝串,放置蓝串于下方。发现没有那个伸出去一截了,也就是说,当前拼的大串,我们已经找到有两种拼法了。
·总结规律:只要还伸出去了一截,我们就永不停息,直到没有伸出的一截。说句老实话,找不到就是找不到,还是要停息的(不停息的现实意义就是超时)。
·方法:枚举两两模板串,并记录一个模板串的第i位开始,可以接上(即上文的相同)另一个串的开头(举例子就是红串的第6位开始可以接上黄串)。怎样表示关系呢?就建边把,将每一个模板串的每一位看成一个节点,然后就搭建有向边(比如红串第6位可一建一条边通向黄串第5位)。什么时候结束呢,如果从某个串i位到末尾就完全等于一个另一个模板串(就像上文黄串与蓝串的关系一样),就说明不会冒出一截了,也就是找到答案。
·代码(防水的)浮出水面:
#include<stdio.h>
#include<cstring>
#define go(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,x) for(int i=a[x],v=e[i].v;i;i=e[i].next,v=e[i].v)
const int N=;struct E{int v,next;}e[N*];
int T,x,n,m,len[N],sz,ID[N][],head[N*],k,over;char s[N][];bool vis[N*],can;
void ADD(int u,int v){e[k]=(E){v,head[u]};head[u]=k++;}
void dfs(int u){if(can=u==over)return;vis[u]=;fo(i,head,u)if(!vis[v]){dfs(v);if(can)return;}}
int main(){while(scanf("%d",&x),can=sz=,k=,x)
{
go(i,,x){scanf("%s%s",s[i]+,s[i]+);len[i]=strlen(s[i]+);
go(j,,len[i])vis[sz]=head[ID[i][j]=++sz]=;}vis[sz+]=; go(a,,x){n=len[a];go(I,,n){go(b,,x){m=len[b];
if(a==b&&I==)continue;int i=I-,j=;
while(s[a][++i]==s[b][++j]&&i<=n&&j<=m);
if(i>n&&j>m) ADD(ID[a][I],over);
if(i<=n&&j>m)ADD(ID[a][I],ID[a][i]);
if(i>n&&j<=m)ADD(ID[a][I],ID[b][j]);
}}}
go(i,,x){if(!vis[ID[i][]])dfs(ID[i][]);if(can)break;}
printf("Case #%d: ",++T);puts(can?"Ambiguous.":"Not ambiguous.");
}return ;}//Paul_Guderian
我无法忘记故乡秋末的麦地,
和南方水柳摇摆的倩影。——————汪峰《雨天的回忆》
【Uva 11604 编码都有歧义了】的更多相关文章
- General Sultan UVA - 11604(建图暴力)
给出n个字符串,询问是否存在一个字符串(可以是给出的几个中的 也可以是组合成的),使得用字符串(随便你用多少个)来拼凑这个串,能够至少有两种拼法 解析: 把每一个字符串的每一个位置的字符看作结点,进行 ...
- UVA - 11604 General Sultan 题解
题目大意: 有若干模式串,将某些模式串拼接起来(一个可以使用多次)形成一个长模式串,判断能否有两种或更多种不同的拼法拼成相同的模式串. 思路: 神奇的构图,暴力的求解. 可以发现,若有不同的拼法,则一 ...
- 无视编码都统一转成unicode 然后截断 例如 。“发发发发发发” 操作之后显示为 “发发发发...”
-- local function checkPlayName( str ) -- str = Utils.utf8_to_unicode(str)-- local retStr = "&q ...
- 一张图理清计算机常见编码的关系。ASCII、Unicode都不是事儿
编码按适用范围可以简单分为:(本人自定义) 美国编码(ASCII)ASCII为基础编码,来源于美国:其它编码都兼容ASCII编码: 欧盟编码(ISO8859-1.WINDOWS-1252)先是ISO- ...
- 【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)
转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC ...
- RFID 基础/分类/编码/调制/传输
不同频段的RFID产品会有不同的特性,本文详细介绍了无源的感应器在不同工作频率产品的特性以及主要的应用. 目前定义RFID产品的工作频率有低频.高频和甚高频的频率范围内的符合不同标准的不同的产品,而且 ...
- 坑爹的对GBK编码的字符进行url编码
url编码又叫百分号编码 现在的url编码十分混乱,都没有按照新标准来 对汉字都按照不同的编码后再进行url编码 2005年1月发布的RFC 3986,强制所有新的URI必须对未保留字符不加以百分号编 ...
- 与QString("我是中文")完全一样,你必须告诉tr这个窄字符串是何种编码?你不告诉它,它就用latin1。于是所谓的乱码问题就出来了。
在论坛中漂,经常遇到有人遇到tr相关的问题.用tr的有两类人: (1)因为发现中文老出问题,然后搜索,发现很多人用tr,于是他也开始用tr (2)另一类人,确实是出于国际化的需要,将需要在界面上显示的 ...
- UVA 322 ships (POJ 1138)
题目地址: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
随机推荐
- Linux下进程间通信--消息队列
消息队列的定义遍地都是,不想移驾,请看下文: 一.定义: 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认 为是有一个类型,接收者进程接收的数据块可以有不同的类型值.我 ...
- 201621123031 《Java程序设计》第9周学习总结
作业09-集合与泛型 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 一.泛型的基本概念 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Paramet ...
- 《招一个靠谱的移动开发》iOS面试题及详解(上篇)
以下问题主要用于技术的总结与回顾 主要问题总结 单例的写法.在单利中创建数组应该注意些什么. NSString 的时候用copy和strong的区别. 多线程.特别是NSOperation 和 GCD ...
- python 网络爬虫与信息提取 学习笔记day4
正则表达式简介: 简洁表示一组字符串的特征或者模式,在文本处理中十分常用,主要应用于字符串匹配中 1. 通用的字符串表达框架 2. 简洁表达一组字符串的表达式 3. 针对字符串表达简洁和特征思想 ...
- Linux--慕课学习
刚开始接触Linux,很有幸的在慕课网上看到了Peter老师的Linux入门课程,老师讲课真的式行云流水,深入浅出,循循善诱,层层递进. 老师分享的都是自己多年来总结的经验.看完之后也学到了很多东西. ...
- 分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等
游戏是自己整理的邮箱来源于网上,下面是我的有道云的分享地址: https://note.youdao.com/share/?id=c5f258fa9efd1b28b2d8f0d37e59b194&am ...
- Xshell与虚拟机不能正常连接
1.发现Xshell与虚拟机下的两个CentOS都不能正常连接,在这些系统下采用ifconfig查询发现eth0都没有ip地址,进而想到可能是虚拟机的设置出了问题,后来又想到自己之前曾经尝试过设置VM ...
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...
- ZOJ-1586 QS Network---最小生成树Prim
题目链接: https://vjudge.net/problem/ZOJ-1586 题目大意: 首先给一个t,代表t个测试样例,再给一个n,表示有n个QS装置,接下来一行是n个QS装置的成本.接下来是 ...
- hdu1009 FatMouse' Trade---贪心
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1009 题意:一共有n个房子,每个房子里有老鼠喜欢吃的javabeans,但是每个房间里的javabea ...