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 ...
随机推荐
- LinuxMysql命令操作数据库
键入命令mysql -uroot -p密码查看所有表:mysql> show databases;进入表use multidomain_db;删除表:DROP table colour 执行sq ...
- swing中JTable的使用方法
public static void main(String[] args) { Student s1 = new Student("张三", "001", 0 ...
- nginx优化
此文章非原创,出自鸟哥之手~ http://blog.chinaunix.net/uid-25266990-id-2985541.html 改排版改得多,当然红色部分要注意下,用得较多 ------- ...
- pureftp 服务
没啥图,不喜勿喷---_- ftp(file transfer protocol)--文件传输协议 (a)官网:www.pureftpd.org (b)原理 让用户连接上一个远程计算机(运行FTP ...
- shell 脚本随机抽取班级学生
#/bin/bash jw=(name1,name2,name3......name39) ..} do a=$(date +%N) b=$() ]" "${jw[$b]} don ...
- SQL SERVER中如何在声明游标的语句中,用变量做表名
-- 因为定义游标所用的表名是变量,所以采用EXEC(定义语句) 的方式来声明游标set @StrSql='DECLARE Ba_Cursor CURSOR FOR (SELECT a.PhoneId ...
- cout 格式化输出
一直习惯于C语言的printf函数来打印,突然有一天要用cout来打印,发现有点不适应. 原来cout也是有格式化输出的. 首先要引入头文件 #include<iostream> // 在 ...
- 也说python的类--基于python3.5
在面向对象的语言中,除了方法.对象,剩下的一大重点就是类了,从意义上来讲,类就是对具有相同行为对象的归纳.当一个或多个对象有相同属性.方法等共同特征的时候,我们就可以把它归纳到同一个类当中.在使用上来 ...
- Swift - 代码创建NSLayoutConstraint布局
NSLayoutConstraint参数说明: /** * 创建约束 NSLayoutConstraint 参数 说明: * item 自己 * attribute * relatedBy 大于等于 ...
- C#重启IIS指定网站和指定应用程序池
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...