* Returns an automaton accepting every substring of every string accepted by the
* specified automaton.
*/
public static Automaton getSubstringsOf(Automaton automaton) {
Automaton result = automaton.clone();
result.removeDeadTransitions();
Collection<StatePair> epsilons = new ArrayList<StatePair>();
for (State state : result.getStates()) {
state.setAccept(true);
if (state != result.getInitialState()) {
epsilons.add(new StatePair(result.getInitialState(), state));