题目大意

  给你一个自动机,包含\(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. 01-JavaScript介绍

    JavaScript价绍 1.引言 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) ...

  2. django之全局默认设置查看及admin语言设置

    django之admin语言设置 admin后台管理默认使用的是英文,有时我们需要将其设置成自己的语言以方便使用管理: 将 LANGUAGE_CODE = '' 设置为欲设置的语言即可. 以下为dja ...

  3. 软件工程(FZU2015) 赛季得分榜,第六回合

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分: 团队项目分=团队得分+个人贡献分 个人贡献分: 个人 ...

  4. oracle查询不走索引的一些情况(索引失效)

    Oracle建立索引的目的是为了避免全表扫描,提高查询的效率. 但是有些情况下发现即使建立了索引,但是写出来的查询还是很慢,然后会发现是索引失效导致的,所以需要了解一下那些情况会导致索引失效,即查询不 ...

  5. C# Note1:深入浅出WPF-MVVM篇

    一.资源说明 (1)配套视频:深入浅出WPF  讲的不错! 待更!

  6. html 引入页面公共部分(header、footer)

    html引入页面的公共部分,比如导航栏啊,页头页脚之类的. 1.将需要引入的公共html部分转换为js文件,这里推荐一个转换工具地址 http://tool.chinaz.com/Tools/Html ...

  7. AssemblyScript的测试

    详细文档介绍 export function f(x: i32): i32 { if (x === 1 || x === 2) { return 1; } return f(x - 1) + f(x ...

  8. java学习之—栈匹配字符串符号

    /** * 栈 * Create by Administrator * 2018/6/11 0011 * 上午 10:20 **/ public class StackR { private int ...

  9. python之路--面向对象-成员

    一 . 成员 在类中你能写的所有内容都是类的成员 class 类名: # 方法 def__init__(self, 参数1, 参数2...): # 属性变量 self.属性1 = 参数1 self.属 ...

  10. Windows开启WMI时一些总结

    通过远程的方式连接WMI获取计算机信息时,可能会出现远程主机拒绝访问,这时就要通过下面的方式来开启当前计算机的WMI服务,下面以Win7和Win10为例来进行相关的说明,通过一步步排查去连接远程服务. ...