Zadání https://cw.felk.cvut.cz/courses/a4m33pal/task.php?task=incomplete_automaton
11/12 - zaseklo se to při vypisování výsledků u private 08, Description: 'S=400, A=3, F=15, P=54, N=246, L=4000'
package pal; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.StringTokenizer; public class Main { public static int countStates; public static int alphabetSize; public static int countFinals; public static int countPositive; public static int countNegative; public static int wordSize; public static int[][] automat; public static int[][] inStates; public static int countAllWords; public static int aValue = (int) 'a'; public static void main(String[] args) throws IOException { //args = new String[]{"pub10.in"}; BufferedReader br = (args.length == 0) ? new BufferedReader(new InputStreamReader(System.in)) : new BufferedReader(new InputStreamReader(new FileInputStream(args[0]))); StringTokenizer configuration = new StringTokenizer(br.readLine()); countStates = Integer.parseInt(configuration.nextToken()); alphabetSize = Integer.parseInt(configuration.nextToken()); countFinals = Integer.parseInt(configuration.nextToken()); countPositive = Integer.parseInt(configuration.nextToken()); countNegative = Integer.parseInt(configuration.nextToken()); wordSize = Integer.parseInt(configuration.nextToken()); automat = new int[countStates][alphabetSize]; countAllWords = countPositive + countNegative; inStates = new int[countAllWords][]; String[] in; //vytvareni automatu for (int i = 0; i < countStates; i++) { in = br.readLine().split(" "); for (int j = 0; j < alphabetSize; j++) { automat[i][j] = Integer.parseInt(in[j+1]); } } for (int i = 0; i < countAllWords; i++) { inStates[i] = MapWord(br.readLine()); } for (int s = 0; s < countStates; s++) { int[] outStates = new int[countAllWords]; for (int ss = 0; ss < countAllWords; ss++) { outStates[ss] = s; } for (int i = 0; i < wordSize; i++) { for (int si = 0; si < countAllWords; si++) { outStates[si] = automat[outStates[si]][inStates[si][i]]; } } testOutStates(outStates, s); } } public static void testOutStates(int[] outStates, int index) { StringBuilder sb = new StringBuilder(); HashSet<Integer> hs = new HashSet<>(countAllWords); // prvnich P indexu pole musi byt presne F ruznych hodnot // ve zbylych indexch(N) nesmi bzyt index z prvnich P for (int i = 0; i < countPositive; i++) { hs.add(outStates[i]); } if (hs.size() == countFinals) { for (int i = countPositive; i < countAllWords; i++) { if (hs.contains(outStates[i])) { return; } } //vypis ArrayList ar = new ArrayList<>(hs); Collections.sort(ar); //vzestupne Integer o = index; String out = o.toString(); sb.append(out); for (Object a : ar) { sb.append(" "); sb.append(a.toString()); } sb.append("\n"); System.out.print(sb); } } public static int[] MapWord(String word) { int[] res = new int[wordSize]; for (int i = 0; i < wordSize; i++) { res[i] = (int) word.charAt(i) - aValue; } return res; } }