XSY1552 自動機 構造

2021-08-06 01:42:46 字數 1741 閱讀 3018

給你乙個自動機,包含

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 請輸入文法 ...