42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
|
import sys
|
||
|
|
||
|
def load_data(file_path):
|
||
|
nfa = {}
|
||
|
with open(file_path, 'r') as file:
|
||
|
for line in file:
|
||
|
split_data = line.strip().split('\t')
|
||
|
if len(split_data) == 3:
|
||
|
state, next_state, symbol = split_data
|
||
|
key = (int(state), symbol)
|
||
|
if key in nfa:
|
||
|
nfa[key].add(int(next_state))
|
||
|
else:
|
||
|
nfa[key] = {int(next_state)}
|
||
|
|
||
|
return nfa
|
||
|
|
||
|
def is_accepted(nfa, input, current_states, accepting_states):
|
||
|
for symbol in input:
|
||
|
new_states = set()
|
||
|
for state in current_states:
|
||
|
key = (state, symbol)
|
||
|
if key in nfa:
|
||
|
new_states.update(nfa[key])
|
||
|
current_states = new_states
|
||
|
|
||
|
return any(state in accepting_states for state in current_states)
|
||
|
|
||
|
# Set of accepting states
|
||
|
accepting_states = {3,4}
|
||
|
|
||
|
nfa_file = sys.argv[1]
|
||
|
nfa = load_data(nfa_file)
|
||
|
|
||
|
for line in sys.stdin:
|
||
|
input_str = line.strip()
|
||
|
start_states = {0}
|
||
|
if is_accepted(nfa, input_str, start_states, accepting_states):
|
||
|
print("YES")
|
||
|
else:
|
||
|
print("NO")
|