<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package utp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.HashMap;
import java.util.Set;

public class Automaton&lt;T&gt; {
	private List&lt;HashMap&lt;T, Set&lt;Integer&gt;&gt;&gt; m_transitions;
	private boolean[] m_endStates;

	public Automaton(int n) {
		m_transitions = new ArrayList&lt;HashMap&lt;T, Set&lt;Integer&gt;&gt;&gt;(n);
		m_endStates = new boolean[n];
		for(int i  = 0 ; i &lt; n ; i++)
		{
			m_transitions.add(new HashMap&lt;T, Set&lt;Integer&gt;&gt;());
			m_endStates[i] = false;
		}
	}
	
	public void addEdge(int a, int b, T symbol)
	{
		HashMap&lt;T, Set&lt;Integer&gt;&gt; nexts = m_transitions.get(a);
		Set&lt;Integer&gt; trg = nexts.get(symbol);
		if(trg == null)
		{
			trg = new HashSet&lt;Integer&gt;();
			nexts.put(symbol, trg);
		}
		trg.add(b);
	}
	
	public void removeEdge(int a, int b, T symbol)
	{
		HashMap&lt;T, Set&lt;Integer&gt;&gt; nexts = m_transitions.get(a);
		Set&lt;Integer&gt; trg = nexts.get(symbol);
		if(trg != null) trg.remove(b);
	}
	
	public void addEndState(int a)
	{
		m_endStates[a] = true;
	}
	
	public void removeEndState(int a)
	{
		m_endStates[a] = false;
	}
	
	public boolean isEnd(int a)
	{
		return m_endStates[a];
	}
	
	
	public boolean recognize(List&lt;T&gt; word)
	{
		return recognize(word, 0, 0);
	}
	
	private boolean recognize(List&lt;T&gt; word, int i, int s)
	{
		if(word.size() == i) return isEnd(s);
		T letter = word.get(i);
		Set&lt;Integer&gt; nexts = m_transitions.get(s).get(letter);
		if(nexts == null) return false;
		for(Integer nextState : nexts)
		{
			if(recognize(word, i+1, nextState)) return true;
		}
		return false;
	}
	
	public static void main(String[] args)
	{
		Automaton&lt;String&gt; aut = new Automaton&lt;String&gt;(4);
		
		aut.addEdge(0, 1, "a");
		aut.addEdge(0, 1, "b");
		
		aut.addEdge(0, 2, "a");
		aut.addEdge(0, 3, "b");
		
		aut.addEdge(1, 1, "a");
		aut.addEdge(1, 2, "a");
		
		aut.addEdge(2, 3, "a");
		
		aut.addEdge(3, 3, "b");
		
		aut.addEndState(3);
		
		
		List&lt;String&gt; word = Arrays.asList("a", "b", "a");
		
		System.out.println(aut.recognize(word));
		
		
		
		
		
	}
	

	
}</pre></body></html>