Trong quá trình xây dựng lexer, một DFA thường được rút gọn (minimize) để có số trạng thái ít nhất có thể mà vẫn nhận đúng cùng một ngôn ngữ — điều này giúp bảng chuyển trạng thái của lexer nhỏ gọn hơn.
Cho một DFA đầy đủ (mọi trạng thái đều có bước chuyển xác định cho mọi ký tự trong bộ chữ cái Σ, không có −1) với Q trạng thái, trạng thái bắt đầu là 0, và tập trạng thái kết thúc cho trước. Hãy tính số trạng thái tối thiểu của DFA tương đương (nhận đúng cùng ngôn ngữ), theo quy trình chuẩn:
Kết quả cần tìm là số lớp tương đương thu được ở bước 2 (chính là số trạng thái của DFA tối thiểu).
Dòng 1: hai số nguyên Q và k (1≤Q≤200, 1≤k≤20) — số trạng thái và kích thước bộ chữ cái. Dòng 2: k ký hiệu của bộ chữ cái, cách nhau dấu cách. Q dòng tiếp theo, dòng thứ i (ứng trạng thái i−1) gồm k số nguyên trong [0,Q−1]: bước chuyển của trạng thái i−1 theo từng ký hiệu tương ứng, theo đúng thứ tự đã liệt kê ở dòng 2 (DFA đầy đủ, không có bước chuyển thiếu). Dòng cuối: số nguyên A (số trạng thái kết thúc) rồi A số nguyên là các trạng thái kết thúc (nếu A=0, chỉ có số 0 trên dòng đó).
In ra một số nguyên duy nhất — số trạng thái của DFA tối thiểu tương đương (chỉ tính trên các trạng thái reachable từ trạng thái 0).
Ví dụ:
Đầu vào:
2 2
0 1
0 1
1 0
1 0
Đầu ra:
2
Đầu vào:
4 2
a b
1 0
1 2
1 0
1 2
1 3
Đầu ra:
1
Đang tải editor...