UVa11604 General Sultan

server/2024/10/18 7:52:23/

UVa11604 General Sultan

  • 题目链接
  • 题意
  • 分析
  • AC 代码

题目链接

   UVA - 11604 General Sultan

题意

   给出一些0和1组成的模式串,问是否存在一个串使得有多种方案将这个串分解成模式串。
   给一个包含n(n≤100)个符号的二进制编码方式,是否存在一个二进制序列,存在至少两种解码方法。比如{a=01, b=001, c=01001}是有歧义的,因为01001可以解码为a+b或者c。每个编码由不超过20个0或1组成。

分析

   很好的一道图论建模题目!思路来自于HouseFangFZC的博文。
   先看一个两种方案去拼接形成同一个串的图:
<a class=UVa11604 General Sultan" />
   可以发现总是一个方案新追加的串和另一个方案当前未匹配部分做匹配,并且其中一者完全匹配掉,另一者有剩余部分(或者另一者也匹配完,即找到了两种不同拼接方案)。
   将每个模式串的每一个字符看成一个结点,并额外增加起点s、终点t两个虚拟结点。首先起点与每个模式串的首字母连一条有向边。对于第i个模式串,考虑其第 h i h_i hi个字符开始的子串(对应节点u),若其与第j个模式串做匹配(注意 h i = 0 h_i=0 hi=0时, j ≠ i j\ne i j=i)满足至少一者匹配到结尾,则连有向边,分三种情况:若两者都匹配完,则 u → t u\rightarrow t ut;若模式串j的首个未匹配字符是 h j h_j hj(对应节点v),则 u → v u\rightarrow v uv;若子串 h i h_i hi的首个未匹配字符是 h x h_x hx(对应节点w),则 u → w u\rightarrow w uw
   有向图建完后,跑一遍dfs,看起点s能否到达终点t就能解决问题。

AC 代码

#include <iostream>
#include <cstring>
using namespace std;#define L 22
#define N 101
int g[N*L][N*L], c[N*L], e[N], t[N], m, n, kase = 0; char s[N][L], tmp[L]; bool vis[N*L];int common(int i, int h, int j) {int k = 0;while (h < e[i]) {if (s[i][h] != s[j][k]) return k;++h; ++k;}return k;
}bool dfs(int u = 0) {if (u == m) return true;vis[u] = true;for (int i=0, v; i<c[u]; ++i) if (!vis[v = g[u][i]] && dfs(v)) return true;return false;
}void solve() {memset(c, 0, sizeof(c)); memset(vis, 0, sizeof(vis));for (int i=0; i<n; ++i) cin >> tmp >> s[i], e[i] = strlen(s[i]), g[0][c[0]++] = t[i] = i<1 ? 1 : t[i-1] + e[i-1];m = t[n-1] + e[n-1];for (int i=0; i<n; ++i) for (int j=0; j<e[i]; ++j) for (int k=0; k<n; ++k) {if (i==k && j==0) continue;int cc = common(i, j, k), u = t[i]+j;if (cc == e[k] && cc+j == e[i]) g[u][c[u]++] = m;else if (cc < e[k] && cc+j == e[i]) g[u][c[u]++] = t[k] + cc;else if (cc == e[k] && cc+j < e[i]) g[u][c[u]++] = u + cc;}cout << "Case #" << ++kase << (dfs() ? ": Ambiguous." : ": Not ambiguous.") << endl;
}int main() {ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);while (cin >> n && n) solve();return 0;
}

http://www.ppmy.cn/server/46893.html

相关文章

【计算机毕设】基于SpringBoot的医院管理系统设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本项目旨在设计并实现一个基于SpringBoot的医院管理系统&#xff0c;以提高医院管理效率&#xff0c;优化医疗服务流程&#xff0c;提升患者就诊体验…

SMV 算法【python,机器学习,算法】

支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一类按监督学习&#xff08;supervised learning&#xff09;方式对数据进行二元分类的广义线性分类器&#xff08;generalized linear classifier&#xff09;&#xff0c; 其决策边界是对学习样本求解的最大…

信息与未来2015真题笔记

[信息与未来 2015] 加数 题目描述 给出一个正整数 n n n&#xff0c;在 n n n 的右边加入 ⌊ n 2 ⌋ \left\lfloor\dfrac n2\right\rfloor ⌊2n​⌋&#xff0c;然后在新数的右边 再加入 ⌊ ⌊ n 2 ⌋ 2 ⌋ \left\lfloor\dfrac{\left\lfloor\dfrac n2\right\rfloor}2\rig…

【C#】自定义List排序规则的两种方式

目录 1.系统排序原理 2.方式一&#xff1a;调用接口并重写 3.方式二&#xff1a;传排序规则函数做参数 1.系统排序原理 当我们对一个List<int>类型的数组如list1排序时&#xff0c;一个轻松的list1.sort();帮我们解决了问题 但是在实际应用过程中&#xff0c;往往我们…

Linux文件系统和日志分析

一、深度认识文件系统 1.1 iNode号 iNode&#xff1a;元信息 1.1.1 iNode内容 iNode的内容包括文件的大小&#xff0c;属性&#xff0c;权限&#xff0c;UID&#xff0c;GID&#xff0c;时间戳等。 时间戳&#xff1a; atime&#xff1a;access time&#xff0c;访问时间…

排序-希尔排序

介绍 希尔排序属于那种没有了解过的直接看代码一脸懵逼的&#xff0c; 所以同学们尽量不要直接看代码&#xff0c;仔细阅读本篇博客内容。 插入排序本来算是一个低效排序&#xff0c; 一次只可以挪动一个数据&#xff0c; 但是&#xff0c;它的强来了&#xff01;&#xff01…

Matplotlib绘图指南:从基础绘图到多子图展示

目录 前言 导入模块 第一点&#xff1a;绘制图像 第二点&#xff1a;保存图像 第三点&#xff1a;多图形的绘制 第四点&#xff1a;绘制多子图 总结 前言 在数据可视化中&#xff0c;Matplotlib是一款强大的Python库&#xff0c;提供了丰富的功能来绘制各种类型的图表。…

C# --- 浮点数类型 float, double, decimal

C# --- 浮点数类型 float, double, decimal float, double, decimaldecimal float, double, decimal decimal double 和 float 的采用base 2, 不能精确的表示浮点数, 进行加减乘除的操作的时候会出现精度丢失的问题decimal 采用base 10&#xff0c;可以精确的表示浮点数&#x…