import java.util.Arrays;
public abstract class Main {
int max = 4;
int min = 2;
public static void main
(String args
[]) { new Main() {
public void element(char[] result, int offset, int length) {
}
}.generate("ABCD");
}
private void generate(char[] input) {
char[] result = new char[input.length];
int[] index = new int[input.length];
// initialize the arrays.
Arrays.
fill(result,
0, result.
length, input
[0]); Arrays.
fill(index,
0, index.
length,
0);
// loop over the output lengths.
for (int length = min; length <= max; length++) {
int updateIndex = 0;
do {
element(result, 0, length);
// update values that need to reset.
for (updateIndex = length - 1;
updateIndex != -1 && ++index[updateIndex] == input.length;
result[updateIndex] = input[0], index[updateIndex] = 0, updateIndex--)
;
// update the character that is not resetting, if valid
if (updateIndex != -1) result[updateIndex] = input[index[updateIndex]];
}
while (updateIndex != -1);
}
}
generate(input.toCharArray());
}
public abstract void element(char[] result, int offset, int length);
}
aW1wb3J0IGphdmEudXRpbC5BcnJheXM7CgpwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFpbiB7CiAgICBpbnQgbWF4ID0gNDsKICAgIGludCBtaW4gPSAyOwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHsKICAgICAgICBuZXcgTWFpbigpIHsKICAgICAgICAgICAgcHVibGljIHZvaWQgZWxlbWVudChjaGFyW10gcmVzdWx0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhyZXN1bHQsIG9mZnNldCwgbGVuZ3RoKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LmdlbmVyYXRlKCJBQkNEIik7CiAgICB9CgogICAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKGNoYXJbXSBpbnB1dCkgewogICAgICAgIGNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltpbnB1dC5sZW5ndGhdOwogICAgICAgIGludFtdIGluZGV4ID0gbmV3IGludFtpbnB1dC5sZW5ndGhdOwoKICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBhcnJheXMuCiAgICAgICAgQXJyYXlzLmZpbGwocmVzdWx0LCAwLCByZXN1bHQubGVuZ3RoLCBpbnB1dFswXSk7CiAgICAgICAgQXJyYXlzLmZpbGwoaW5kZXgsIDAsIGluZGV4Lmxlbmd0aCwgMCk7CgogICAgICAgIC8vIGxvb3Agb3ZlciB0aGUgb3V0cHV0IGxlbmd0aHMuCgogICAgICAgIGZvciAoaW50IGxlbmd0aCA9IG1pbjsgbGVuZ3RoIDw9IG1heDsgbGVuZ3RoKyspIHsKICAgICAgICAgICAgaW50IHVwZGF0ZUluZGV4ID0gMDsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgZWxlbWVudChyZXN1bHQsIDAsIGxlbmd0aCk7CgogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHZhbHVlcyB0aGF0IG5lZWQgdG8gcmVzZXQuCiAgICAgICAgICAgICAgICBmb3IgKHVwZGF0ZUluZGV4ID0gbGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW5kZXggIT0gLTEgJiYgKytpbmRleFt1cGRhdGVJbmRleF0gPT0gaW5wdXQubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICByZXN1bHRbdXBkYXRlSW5kZXhdID0gaW5wdXRbMF0sIGluZGV4W3VwZGF0ZUluZGV4XSA9IDAsIHVwZGF0ZUluZGV4LS0pCiAgICAgICAgICAgICAgICAgICAgOwoKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgbm90IHJlc2V0dGluZywgaWYgdmFsaWQKICAgICAgICAgICAgICAgIGlmICh1cGRhdGVJbmRleCAhPSAtMSkgcmVzdWx0W3VwZGF0ZUluZGV4XSA9IGlucHV0W2luZGV4W3VwZGF0ZUluZGV4XV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHVwZGF0ZUluZGV4ICE9IC0xKTsKICAgICAgICB9CiAgICB9CgogICAgdm9pZCBnZW5lcmF0ZShTdHJpbmcgaW5wdXQpIHsKICAgICAgICBnZW5lcmF0ZShpbnB1dC50b0NoYXJBcnJheSgpKTsKICAgIH0KCiAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBlbGVtZW50KGNoYXJbXSByZXN1bHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwp9