for (int i = 0; i < judge.length; ++i) {
final int id = i;
judge[i] = new Thread() {
public void run() {
for (int i = 0; i < maxIdPerJudgeThread; ++i) {
Submission submission = new Submission();
submission.setId(id * maxIdPerJudgeThread + i);
queue.push(submission);
Thread.yield();
queue.remove(submission);
}
}
};
judge[i].start();
}
Thread[] check = new Thread[100];
final long[] start = new long[check.length];
final int[] len = new int[check.length];
final long[] hash = new long[check.length];
for (int i = 0; i < check.length; ++i) {
final int id = i;
check[i] = new Thread() {
public void run() {
hash[id] = len[id] = 0;
JudgingQueueIterator iter = queue.iterator();
for (int i = 0; i < 100; ++i) {
Submission submission = iter.next();
if (submission != null) {
start[id] = hash[id] = submission.getId();
break;
}
Thread.yield();
}
if (len[id] > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
for (Submission submission = iter.next(); submission != null; submission = iter.next()) {
++len[id];
hash[id] = hash[id] * 31 + submission.getId();
}
}
}
};
check[i].start();
}
for (int i = 0; i < judge.length; ++i) {
try {
judge[i].join();
} catch (InterruptedException e) {}
}
for (int i = 0; i < check.length; ++i) {
try {
check[i].join();
} catch (InterruptedException e) {}
}
List<Long> h = new ArrayList<Long>();
List<Long> base = new ArrayList<Long>();
Map<Long, Integer> m = new HashMap<Long, Integer>();
long[] last = new long[judge.length];
for (int i = 0; i < last.length; ++i) {
last[i] = -1;
}
h.add(0L);
base.add(1L);
for (Submission submission = allIter.next(); submission != null; submission = allIter.next()) {
long id = submission.getId();
m.put(id, h.size());
h.add(h.get(h.size() - 1) * 31 + id);
base.add(base.get(base.size() - 1) * 31);
int a = (int) (id / maxIdPerJudgeThread);
long b = id % maxIdPerJudgeThread;