题目大意
给你一个自动机,包含
n
个状态,指令集为前
1≤n≤100,1≤m≤26
题解
首先要证明一个结论:原问题有解等价于对于任意状态
i
,都存在一个指令序列
必要性显然。如果不存在
Si
,那么状态
i
和状态
对于充分性,我们考虑所有当前可能的状态集合
所以我们每次任选
U
中的一个状态
对于状态
i
,求
每个 Si 的长度是 O(n2) 的,总共要执行 O(n) 次,所以答案的长度是 O(n3) 的
代码
#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;
}