給你乙個自動機,包含
n 個狀態,指令集為前
m個小寫字母,對於每個狀態
s 和每個指令
i,自動機均有後繼t(
s,i)
。請你求出乙個長度不超過220
的指令序列,使得無論自動機當前處在哪個狀態(包括初始狀態),按順序執行指令序列的所有指令後,自動機都處於初始狀態
1 。無解輸出[i
mpos
sibl
e] 1
≤n≤100,1
≤m≤26
首先要證明乙個結論:原問題有解等價於對於任意狀態
i ,都存在乙個指令序列si
使得t(s
,si)
=1且t(1
,si)
=1。必要性顯然。如果不存在si
,那麼狀態
i 和狀態
1一定不可能同時轉移到狀態
1 。
對於充分性,我們考慮所有當前可能的狀態集合
u。一開始u=
。每次我們任選
u 中乙個狀態
t,執行st
。這樣我們會得到乙個集合u′
,滿足1∈
u′且|u′
|<|u
| 。這樣我們經過若干步後可以得到u=
。我們把所有st
連在一起得到乙個指令序列
s ,易證
s是滿足要求的。
所以我們每次任選
u 中的乙個狀態
t,求出st
,然後執行st
,直到|u
|=1 為止。
對於狀態
i ,求si
的時間複雜度是o(
n2) 的,執行si
是o(n
3)的,總共要執行o(
n)次,所以時間複雜度是o(
n4) 的。每個s
i 的長度是o(
n2) 的,總共要執行o(
n)次,所以答案的長度是o(
n3) 的
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
typedef pair 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)
}return0;}
int main()
cnt=0;
for(i=1;i<=n;i++)
c[i]=i;
int now=n;
while(now>1)
for(i=1;i<=top;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;}
自動機 構造
題目大意 給你乙隻n個點的確定自動機,和字符集大小m,每個節點都恰好m條轉移邊。構造乙個字串長度不超過1e6,使得從任意節點出發接收這個狀態回到達1號點,n 100,m 26。spj。題解 其實是給你乙個nfa然後求一條路徑,然後我一開始傻叉了,還真的傻了吧唧的寫了個nfa轉dfa以為可過,最後發現...
有窮的自動機構造
include include include intmain 存放非終結符號 char vt 30 存放終結符號 printf 請輸入規則個數 scanf d n line n for i 0 i 30 i 給字串陣列p,q全部賦值為 0 for j 0 j 30 j printf 請輸入文法 n...
有窮的自動機構造
include include include int main 存放非終結符號 char vt 30 存放終結符號 printf 請輸入規則個數 scanf d n line n for i 0 i 30 i 給字串陣列p,q全部賦值為 0 for j 0 j 30 j printf 請輸入文法 ...