Próbuję rozwiązać to zadanie: http://www.spoj.pl/problems/ETI07F3/
Wprawdzie nie na SPOJu ale na platformie, która jest jego bliźniakiem. Problem w tym, że mój kod działa za wolno. W jaki sposób mogę to przyspieszyć?
A oto moje rozwiązanie:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
class Main {
static int level=0;
static class Cyfra {
int wartosc;
int level;
public Cyfra(String wartosc, int level) {
this.wartosc=Integer.parseInt(wartosc);
this.level=level;
}
public boolean equals(Object o) {
Cyfra c2=(Cyfra) o;
return c2.wartosc==wartosc && c2.level==level;
}
public String toString() {
return "Wartosc: "+wartosc+" | Level: "+level;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
int testow=Integer.parseInt(br.readLine());
for(int t=0; t<testow; t++) {
ArrayList<Cyfra> lista=new ArrayList<Cyfra>();
level=0;
int cyfr=Integer.parseInt(br.readLine());
String slowo=br.readLine();
int i=0;
while(lista.size()<cyfr) {
if(slowo.charAt(i)=='(') level++;
else if(slowo.charAt(i)!=' ') {
int poc=i;
while(slowo.charAt(i)!=' ' && slowo.charAt(i)!=')') i++;
lista.add(new Cyfra(slowo.substring(poc,i),level));
}
if(slowo.charAt(i)==')') level--;
i++;
}
slowo=br.readLine();
level=0;
i=0;
boolean czy=true;
while(i<slowo.length()-1 && czy) {
if(slowo.charAt(i)=='(') level++;
else if(slowo.charAt(i)!=' ') {
int poc=i;
while(slowo.charAt(i)!=' ' && slowo.charAt(i)!=')') i++;
Cyfra c=new Cyfra(slowo.substring(poc,i),level);
if(!lista.contains(c)) czy=false;
}
if(slowo.charAt(i)==')') level--;
i++;
}
if(czy) System.out.println("TAK");
else System.out.println("NIE");
}
}
}