题目大意

  给你一个自动机,包含\(n\)个状态,指令集为前\(m\)个小写字母,对于每个状态\(s\)和每个指令\(i\),自动机均有后继\(T(s,i)\)。请你求出一个长度不超过\(2^{20}\)的指令序列,使得无论自动机当前处在哪个状态(包括初始状态),按顺序执行指令序列的所有指令后,自动机都处于初始状态\(1\)。无解输出\([impossible]\)

  \(1\leq n\leq 100,1\leq m\leq 26\)

题解

  首先要证明一个结论:原问题有解等价于对于任意状态\(i\),都存在一个指令序列\(S_i\)使得\(T(s,S_i)=1\)且\(T(1,S_i)=1\)。

  必要性显然。如果不存在\(S_i\),那么状态\(i\)和状态\(1\)一定不可能同时转移到状态\(1\)。

  对于充分性,我们考虑所有当前可能的状态集合\(U\)。一开始\(U=\{1,2,3\ldots n\}\)。每次我们任选\(U\)中一个状态\(t\),执行\(S_t\)。这样我们会得到一个集合\(U'\),满足\(1\in U'\)且\(|U'|<|U|\)。这样我们经过若干步后可以得到\(U=\{1\}\)。我们把所有\(S_t\)连在一起得到一个指令序列\(S\),易证\(S\)是满足要求的。

  所以我们每次任选\(U\)中的一个状态\(t\),求出\(S_t\),然后执行\(S_t\),直到\(|U|=1\)为止。

  对于状态\(i\),求\(S_i\)的时间复杂度是\(O(n^2)\)的,执行\(S_i\)是\(O(n^3)\)的,总共要执行\(O(n)\)次,所以时间复杂度是\(O(n^4)\)的。

  每个\(S_i\)的长度是\(O(n^2)\)的,总共要执行\(O(n)\)次,所以答案的长度是\(O(n^3)\)的

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int a[110][30];
int n,m;
char s[10000010];
int cnt;
int c[110];
int d[110];
int vis[110][110];
int st[10010];
int top;
int dfs(int x,int y)
{
if(x==1&&y==1)
return 1;
vis[x][y]=1;
int i;
for(i=1;i<=m;i++)
{
int lx=a[x][i];
int ly=a[y][i];
if(!vis[lx][ly])
{
st[++top]=i;
if(dfs(lx,ly))
return 1;
top--;
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
a[i][j]++;
}
cnt=0;
for(i=1;i<=n;i++)
c[i]=i;
int now=n;
while(now>1)
{
memset(vis,0,sizeof vis);
top=0;
if(!dfs(1,c[2]))
{
printf("[impossible]");
return 0;
}
for(i=1;i<=top;i++)
{
s[++cnt]=st[i]+'a'-1;
for(j=1;j<=now;j++)
c[j]=a[c[j]][st[i]];
}
sort(c+1,c+now+1);
now=unique(c+1,c+now+1)-c-1;
}
s[cnt+1]='\0';
printf("%s\n",s+1);
return 0;
}

【XSY1552】自动机 构造的更多相关文章

  1. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

  2. POJ 2778:DNA Sequence(AC自动机构造矩阵)

    http://poj.org/problem?id=2778 题意:有m个病毒DNA,问构造一个长度为n的不带病毒DNA的字符串可以有多少种. 思路:看到这题有点懵,想了挺久题解的思路. 使用AC自动 ...

  3. AC自动机基础知识讲解

    AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部 ...

  4. HDU2243 考研路茫茫——单词情结(AC自动机+矩阵快速幂)

    与POJ2778一样.这题是求长度不超过n且包含至少一个词根的单词总数. 长度不超过n的单词总数记为Sn,长度不超过n不包含词根的单词总数记为Tn. 答案就是,Sn-Tn. Sn=26+262+263 ...

  5. ZOJ3228 - Searching the String(AC自动机)

    题目大意 给定一个文本串,接下来有n个模式串,每次查询模式串出现的次数,查询分两种,可重叠和不可重叠 题解 第一次是把AC自动机构造好,跑n次,统计出每个模式串出现的次数,交上去果断TLE...后来想 ...

  6. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  7. [Ahoi2013]差异(后缀自动机)

    /* 前面的那一坨是可以O1计算的 后面那个显然后缀数组单调栈比较好写??? 两个后缀的lcp长度相当于他们在后缀树上的lca的深度 那么我们就能够反向用后缀自动机构造出后缀树然后统计每个点作为lca ...

  8. POJ.2774.Long Long Message/SPOJ.1811.LCS(后缀自动机)

    题目链接 POJ2774 SPOJ1811 LCS - Longest Common Substring 确实比后缀数组快多了(废话→_→). \(Description\) 求两个字符串最长公共子串 ...

  9. 2016ACM/ICPC亚洲区沈阳站H - Guessing the Dice Roll HDU - 5955 ac自动机+概率dp+高斯消元

    http://acm.hdu.edu.cn/showproblem.php?pid=5955 题意:给你长度为l的n组数,每个数1-6,每次扔色子,问你每个串第一次被匹配的概率是多少 题解:先建成ac ...

随机推荐

  1. 小L的项链切割 (回文串)

    题目描述 小T送给了小L了一串项链.为了方便,我们把项链上形态不同钻石用不同的字母表示.这样小L的项链就变成了一个字符串.小L忽然想把这串项链优美地切割一下,她想把它切割成尽量少的回文项链,啊也就是回 ...

  2. jquery判断<inpur type="checkbox" checked>是否被选择

    建议使用 $('#isCheck').attr('checked') 这样的,利于判断 console.log($('#isCheck').prop('checked')); 可以看出prop当che ...

  3. 1000/problem/A

    传送门: [http://codeforces.com/contest/1000/problem/A] 题意: 一个比赛颁奖,要准备T-Shirt给获奖者,但有的去年获奖过,衣服尺寸可以不改,有的需要 ...

  4. python文件、文件夹的移动、复制、删除、重命名

    import os.path ,shutil shutil.copytree("G://qqfile","G://new_qqfile")# 第一个是原来的文件 ...

  5. html总结:文本框填满表格

    <style> input { width: 100%; }</style>

  6. 【Python3练习题 025】 一个数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同

    [Python练习题 025] 一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同 x = input('请输入任意位数的数字:') if x == x[::-1]: ...

  7. 日期选择器date、week、time、datetime、datetime-local类型

    下面只写两个类型的代码案例,其他都大同小异 date类型: <!DOCTYPE html> <html> <head> <meta charset=" ...

  8. ubunto启动chrome报错

    /usr/bin/google-chrome-stable[5199:5199:0703/143543.136117:ERROR:zygote_host_impl_linux.cc(88)] Runn ...

  9. WEB测试重点--(转载)

    1.功能测试: 所实现的功能是否和需求一致: js错误 页面链接错误-空链接.死链接.错误链接 按钮无效 未实现功能 报错提示信息不准确或不友好 数据库访问错误 sql注入 文档上传下载问题 -未实现 ...

  10. Running Web API using Docker and Kubernetes

    Context As companies are continuously seeking ways to become more Agile and embracing DevOps culture ...