UVA - 11604 General Sultan 题解
题目大意:
有若干模式串,将某些模式串拼接起来(一个可以使用多次)形成一个长模式串,判断能否有两种或更多种不同的拼法拼成相同的模式串。
思路:
神奇的构图,暴力的求解。
可以发现,若有不同的拼法,则一个模式串的前缀要与一个模式串的后缀相同。
因此我们就将问题转化成:从两个模式串开始,不停的按照前后缀匹配,最后达到两个串同时在一个点结束。
那么,将每一个串的每一个字符都看作一个点,n2len2暴力枚举i串从z开始的后缀和j串(自己也可以,但不能让前缀是其本身)的前缀做匹配,看是否能将其中一个串匹配完。
当(i,z)和j匹配,若i先结束了,则将(i,z)这个点连边到j串没匹配的第一个点,表示下一次匹配应该是从j的那个位置开始当后缀再寻找其他前缀;如果j先结束,与之前一个类似;如果i和j同时结束,则连边到终点。
最后用dfs判断能否从某个模式串的第一个点开始走到终点。
PS:1、fromhttp://blog.csdn.net/houserabbit/article/details/38943645
2、数组的意义、范围要清楚,我花了一个多小时才发现数组开小了。
代码:
#include<cstdio>
#include<cstring>
using namespace std;
const int M=,N=;
int n,e,t,i,j,k,z,cnt,v[M*M*N*N],id[M][N],nex[M*M*N*N],len[M],head[M*N];
bool vis[M*N],flag;
char s[M][N]; void add(int x,int y) { v[++cnt]=y,nex[cnt]=head[x],head[x]=cnt; } void dfs(int x)
{
if (x==e) { flag=; return; }
vis[x]=;
for (int i=head[x];~i;i=nex[i])
if (!vis[v[i]])
{
dfs(v[i]);
if (flag) return;
}
} int main()
{
while (~scanf("%d",&n))
{
if (!n) break;
e=cnt=flag=;
for (i=;i<=n;++i)
{
scanf("%s%s",s[i],s[i]);
len[i]=strlen(s[i]);
for (j=;j<len[i];++j) id[i][j]=++e;
}
for (++e,i=;i<=e;++i) head[i]=-;
for (i=;i<=n;++i)
for (z=;z<len[i];++z)
for (j=;j<=n;++j)
{
if (i==j && !z) continue;
for (k=;k<len[j] && z+k<len[i];++k)
if (s[i][z+k]!=s[j][k]) break;
if (z+k==len[i] && k==len[j]) add(id[i][z],e);
else if (k==len[j]) add(id[i][z],id[i][z+k]);
else if (z+k==len[i]) add(id[i][z],id[j][k]);
}
for (i=;i<=e;++i) vis[i]=;
for (i=;i<=n;++i)
{
if (!vis[id[i][]]) dfs(id[i][]);
if (flag) break;
}
printf("Case #%d: ",++t);
if (flag) puts("Ambiguous."); else puts("Not ambiguous.");
}
return ;
}
UVA - 11604 General Sultan 题解的更多相关文章
- General Sultan UVA - 11604(建图暴力)
给出n个字符串,询问是否存在一个字符串(可以是给出的几个中的 也可以是组合成的),使得用字符串(随便你用多少个)来拼凑这个串,能够至少有两种拼法 解析: 把每一个字符串的每一个位置的字符看作结点,进行 ...
- UVA 167 R-The Sultan's Successors
https://vjudge.net/contest/68264#problem/R The Sultan of Nubia has no children, so she has decided t ...
- Uva 167 The Sultan's Successors(dfs)
题目链接:Uva 167 思路分析:八皇后问题,采用回溯法解决问题. 代码如下: #include <iostream> #include <string.h> using n ...
- uva 167 - The Sultan's Successors(典型的八皇后问题)
这道题是典型的八皇后问题,刘汝佳书上有具体的解说. 代码的实现例如以下: #include <stdio.h> #include <string.h> #include < ...
- 【Uva 11604 编码都有歧义了】
·你的目的就是要让编码有歧义,这就美妙了. ·英文题,述大意: 给出n个模板字符串,询问是否存在一个字符串,使得用模板串(随便你用多少个)来拼凑这个串,能够至少有两种拼法.如果有,就输出“ ...
- UVa 202 Repeating Decimals 题解
The decimal expansion of the fraction 1/33 is 0.03, where the 03 is used to indicate that the cycle ...
- UVA 10924 Prime Words 题解
Prime Words A prime number is a number that has only two divisors: itself and the number one. Exampl ...
- UVA 10852 Less Prime 题解
Less Prime Let n be an integer, 100 n 10000, nd the prime number x, x n, so that n
- UVA 10537 The Toll! Revisited uva1027 Toll(最短路+数学坑)
前者之所以叫加强版,就是把uva1027改编了,附加上打印路径罢了. 03年的final题哦!!虽然是水题,但不是我这个只会做图论题的跛子能轻易尝试的——因为有个数学坑. 题意:运送x个货物从a-&g ...
随机推荐
- Ubuntu安装SSH服务器故障分析及解决办法(错误1:E:软件包 openssh-server 还没有可供安装的候选者,错误2:E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系)
• 微博: 小样儿老师2015 Windows下做Linux开发需要SSH强大功能的支持.安装SSH的过程会出现了很多问题,看完这篇文章可以让你少走些弯路,PS:折腾一下午的成果. Ubuntu ...
- UnixBench-linux下的跑分软件
UnixBench是一款开源的测试 unix 系统基本性能的工具,是比较通用的测试VPS性能的工具.UnixBench会执行一系列的测试,包括2D和3D图形系统的性能,测试的结果不仅仅是CPU,内存, ...
- Sicily 1444: Prime Path(BFS)
题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 #include<bits/stdc++.h& ...
- Java transient 关键字
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问. 2)transient关键字只能修饰变量,而不能修饰方法和类.注意,本地变量是不能被trans ...
- Qt - 读取GPS数据
1.GPS型号为ublox(EVK-M8L),配有USB接口,Qt版本5.7 2.实现步骤: (1)实现串口通信 采用Qt5.7 内置的串口操作类QSerialPort和QSerialPortInfo ...
- Eclipse最常用快捷键
常用快捷键: Ctrl + 1 :快速修复(当编辑器出现红色波浪线时使用此快捷键能快速弹出提示) Ctrl + d :删除当前光标所在的行 Ctrl + z :撤销上一步的操作 Ctrl + y :重 ...
- java 基础导航
ecplise 常用快捷键 java notepad++ java封装好处和原则 java1 基本概述和java环境变量配置 java2 基本概念介绍和基本关键字.基本数据类型 java3 基本流程语 ...
- PHP Windows环境部署
1. 说明 本文用来在windows环境下手工搭建PHP开发环境,安装的功能模块主要包含MySQL,PHP以及Apache三个,环境如下: l Window7(64位) l MySQL 5.7.14 ...
- ffmpeg-20161104[07,10,16,21,22,27,30]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- - > code vs 3038 3n+1问题(递归)
3038 3n+1问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 3n+1问题是一个简单有趣而又没有解决的数 ...