/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
ArrayList<Input>inputs = new ArrayList<Input>();
// inputs.add(new Input("baaaa", "aaaab", true));
inputs.add(new Input("aaaba", "aabaa", true));
inputs.add(new Input("aaaba", "baaaa", true));
// inputs.add(new Input("aaaba", "bbaaa", false));
// inputs.add(new Input("aaaba", "abbaa", false));
// inputs.add(new Input("aaaba", "ababa", false));
// inputs.add(new Input("baaaa", "baaab", false));
// inputs.add(new Input("hello", "elloh", true));
// inputs.add(new Input("waterbottle", "erbottlewat", true));
// inputs.add(new Input("", "", true));
// inputs.add(new Input("hi", "hi", true));
// inputs.add(new Input("hi", "h", false));
// inputs.add(new Input("a", "a", false));
// inputs.add(new Input("hi", "it", false));
// inputs.add(new Input("waterbottle", "erbottlewta", false));
for(int i = 0; i < inputs.size(); i++) {
System.
out.
printf("input: <%s>\t<%s>\n", inputs.
get(i
).
s1, inputs.
get(i
).
s2); System.
out.
printf("\texpected: %b\n", inputs.
get(i
).
expected); boolean output = isRotation(inputs.get(i).s1, inputs.get(i).s2);
System.
out.
printf("\toutput: %b\n", output
); if(output != inputs.get(i).expected) {
System.
out.
printf("\tCASE FAILED!\n"); }
}
}
// check if sub is a substring of str
return str.indexOf(sub) > 0;
}
// check if s2 is a rotation of sl using only one call to isSubstring
int s1Len = s1.length();
int s2Len = s2.length();
if(s1Len != s2Len) {
return false;
}
if(s1 == "" && s2 == "") {
return true;
}
boolean fullMatch;
for(int i = 0; i < s1Len; i++) { // traverse s1 once
fullMatch = true;
for(int j = 0; j < s2Len; j++) {
if(s1.charAt(i) != s2.charAt(j)) {
fullMatch = false;
break;
}
i = (i + 1) % s1Len;
}
if(fullMatch == true) {
return true;
}
}
return false;
}
static class Input {
boolean expected;
this.s1 = s1;
this.s2 = s2;
this.expected = expected;
}
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lIHsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7CiAgICBBcnJheUxpc3Q8SW5wdXQ+aW5wdXRzID0gbmV3IEFycmF5TGlzdDxJbnB1dD4oKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJiYWFhYSIsICJhYWFhYiIsIHRydWUpKTsKICAgIGlucHV0cy5hZGQobmV3IElucHV0KCJhYWFiYSIsICJhYWJhYSIsIHRydWUpKTsKICAgIGlucHV0cy5hZGQobmV3IElucHV0KCJhYWFiYSIsICJiYWFhYSIsIHRydWUpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJhYWFiYSIsICJiYmFhYSIsIGZhbHNlKSk7CiAgICAvLyBpbnB1dHMuYWRkKG5ldyBJbnB1dCgiYWFhYmEiLCAiYWJiYWEiLCBmYWxzZSkpOwogICAgLy8gaW5wdXRzLmFkZChuZXcgSW5wdXQoImFhYWJhIiwgImFiYWJhIiwgZmFsc2UpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJiYWFhYSIsICJiYWFhYiIsIGZhbHNlKSk7CiAgICAvLyBpbnB1dHMuYWRkKG5ldyBJbnB1dCgiaGVsbG8iLCAiZWxsb2giLCB0cnVlKSk7CiAgICAvLyBpbnB1dHMuYWRkKG5ldyBJbnB1dCgid2F0ZXJib3R0bGUiLCAiZXJib3R0bGV3YXQiLCB0cnVlKSk7CiAgICAvLyBpbnB1dHMuYWRkKG5ldyBJbnB1dCgiIiwgIiIsIHRydWUpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJoaSIsICJoaSIsIHRydWUpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJoaSIsICJoIiwgZmFsc2UpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJhIiwgImEiLCBmYWxzZSkpOwogICAgLy8gaW5wdXRzLmFkZChuZXcgSW5wdXQoImhpIiwgIml0IiwgZmFsc2UpKTsKICAgIC8vIGlucHV0cy5hZGQobmV3IElucHV0KCJ3YXRlcmJvdHRsZSIsICJlcmJvdHRsZXd0YSIsIGZhbHNlKSk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgaW5wdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJpbnB1dDogPCVzPlx0PCVzPlxuIiwgaW5wdXRzLmdldChpKS5zMSwgaW5wdXRzLmdldChpKS5zMik7CiAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJcdGV4cGVjdGVkOiAlYlxuIiwgaW5wdXRzLmdldChpKS5leHBlY3RlZCk7CiAgICAgIGJvb2xlYW4gb3V0cHV0ID0gaXNSb3RhdGlvbihpbnB1dHMuZ2V0KGkpLnMxLCBpbnB1dHMuZ2V0KGkpLnMyKTsKICAgICAgU3lzdGVtLm91dC5wcmludGYoIlx0b3V0cHV0OiAlYlxuIiwgb3V0cHV0KTsKICAgICAgaWYob3V0cHV0ICE9IGlucHV0cy5nZXQoaSkuZXhwZWN0ZWQpIHsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXHRDQVNFIEZBSUxFRCFcbiIpOwogICAgICB9CiAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwogICAgfQogIH0KCiAgLy8gY2hlY2sgaWYgc3ViIGlzIGEgc3Vic3RyaW5nIG9mIHN0cgogIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1N1YnN0cmluZyhTdHJpbmcgc3RyLCBTdHJpbmcgc3ViKSB7CiAgICByZXR1cm4gc3RyLmluZGV4T2Yoc3ViKSA+IDA7CiAgfQoKICAvLyBjaGVjayBpZiBzMiBpcyBhIHJvdGF0aW9uIG9mIHNsIHVzaW5nIG9ubHkgb25lIGNhbGwgdG8gaXNTdWJzdHJpbmcKICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNSb3RhdGlvbihTdHJpbmcgczEsIFN0cmluZyBzMikgewogICAgaW50IHMxTGVuID0gczEubGVuZ3RoKCk7CiAgICBpbnQgczJMZW4gPSBzMi5sZW5ndGgoKTsKICAgIGlmKHMxTGVuICE9IHMyTGVuKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGlmKHMxID09ICIiICYmIHMyID09ICIiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYm9vbGVhbiBmdWxsTWF0Y2g7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgczFMZW47IGkrKykgeyAvLyB0cmF2ZXJzZSBzMSBvbmNlCiAgICAgIGZ1bGxNYXRjaCA9IHRydWU7CiAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBzMkxlbjsgaisrKSB7CiAgICAgICAgaWYoczEuY2hhckF0KGkpICE9IHMyLmNoYXJBdChqKSkgewogICAgICAgICAgZnVsbE1hdGNoID0gZmFsc2U7CiAgICAgICAgICBicmVhazsgCiAgICAgICAgfQogICAgICAgIGkgPSAoaSArIDEpICUgczFMZW47CiAgICAgIH0KICAgICAgaWYoZnVsbE1hdGNoID09IHRydWUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgc3RhdGljIGNsYXNzIElucHV0IHsKICAgIFN0cmluZyBzMTsKICAgIFN0cmluZyBzMjsKICAgIGJvb2xlYW4gZXhwZWN0ZWQ7CgogICAgcHVibGljIElucHV0KFN0cmluZyBzMSwgU3RyaW5nIHMyLCBib29sZWFuIGV4cGVjdGVkKSB7CiAgICAgIHRoaXMuczEgPSBzMTsKICAgICAgdGhpcy5zMiA9IHMyOwogICAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7CiAgICB9CiAgfQp9