import java.util.concurrent.TimeUnit;
import java.util.regex.Pattern;
import static java.
lang.
System.
*; import static java.util.concurrent.TimeUnit.NANOSECONDS;
public class Main
{
public static void main
(String[] args
) {
long ns = 0L;
Pattern lazy = Pattern.compile("^(11+?)\\1+$");
Pattern greedy = Pattern.compile("^(11+)\\1+$" );
ns=nanoTime(); lazy .matcher(new Rep('1',100160079)).matches(); out.println("Lazy Rep : "+ NANOSECONDS.toMillis(nanoTime()-ns));
//ns=nanoTime(); greedy.matcher(new Rep('1',100160079)).matches();out.println("Greedy Rep :"+ NANOSECONDS.toMillis(nanoTime()-ns));
//ns=nanoTime(); "1".repeat( 100160079 ).matches("^(11+?)\\1+$") ; out.println("Lazy String:"+ NANOSECONDS.toMillis(nanoTime()-ns));
//ns=nanoTime(); "1".repeat( 100160079 ).matches("^(11+)\\1+$") ; out.println("Greedy String:"+ NANOSECONDS.toMillis(nanoTime()-ns));
//no Pattern.compile()
ns=nanoTime(); lazy.matcher("1".repeat( 100160079 )).matches(); out.println("Lazy String : "+ NANOSECONDS.toMillis(nanoTime()-ns));
//ns=nanoTime(); greedy.matcher("1".repeat( 100160079 )).matches(); out.println("Greedy String:"+ NANOSECONDS.toMillis(nanoTime()-ns));
}
static class Rep implements CharSequence
{
int len;
char base;
public Rep(char x, int count)
{
this.len = count;
this.base = x;
}
@Override
public int length()
{
return len;
}
@Override
public char charAt(int index)
{
return base;
}
@Override
public CharSequence subSequence(int beginIndex, int endIndex)
{
if (beginIndex < 0) {
}
if (endIndex > this.len) {
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
}
return ((beginIndex == 0) && (endIndex == this.len)) ? this
: new Rep(this.base, subLen);
}
@Override
{
return null!=str
? str
: (this.
str = new String(new char[]{base
}).
repeat(len
)); }
}
}
aW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwppbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CmltcG9ydCBzdGF0aWMgamF2YS5sYW5nLlN5c3RlbS4qOwppbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk5BTk9TRUNPTkRTOwoKCnB1YmxpYyBjbGFzcyBNYWluCnsKICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICBsb25nIG5zID0gMEw7CiAgICAgICAgUGF0dGVybiBsYXp5ICAgPSBQYXR0ZXJuLmNvbXBpbGUoIl4oMTErPylcXDErJCIpOwogICAgICAgIFBhdHRlcm4gZ3JlZWR5ID0gUGF0dGVybi5jb21waWxlKCJeKDExKylcXDErJCIgKTsKICAgICAgICBucz1uYW5vVGltZSgpOyAgbGF6eSAgLm1hdGNoZXIobmV3IFJlcCgnMScsMTAwMTYwMDc5KSkubWF0Y2hlcygpOyBvdXQucHJpbnRsbigiTGF6eSBSZXAgICAgOiAiKyBOQU5PU0VDT05EUy50b01pbGxpcyhuYW5vVGltZSgpLW5zKSk7CiAgICAgICAgLy9ucz1uYW5vVGltZSgpOyAgZ3JlZWR5Lm1hdGNoZXIobmV3IFJlcCgnMScsMTAwMTYwMDc5KSkubWF0Y2hlcygpO291dC5wcmludGxuKCJHcmVlZHkgUmVwICA6IisgTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKS1ucykpOwogICAgICAgIAoJCS8vbnM9bmFub1RpbWUoKTsgIjEiLnJlcGVhdCggMTAwMTYwMDc5ICkubWF0Y2hlcygiXigxMSs/KVxcMSskIikgOyBvdXQucHJpbnRsbigiTGF6eSBTdHJpbmc6IisgTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKS1ucykpOwoJCS8vbnM9bmFub1RpbWUoKTsgIjEiLnJlcGVhdCggMTAwMTYwMDc5ICkubWF0Y2hlcygiXigxMSspXFwxKyQiKSA7IG91dC5wcmludGxuKCJHcmVlZHkgU3RyaW5nOiIrIE5BTk9TRUNPTkRTLnRvTWlsbGlzKG5hbm9UaW1lKCktbnMpKTsgICAgICAgIAoJCQogICAgICAgIC8vbm8gUGF0dGVybi5jb21waWxlKCkKICAgICAgICBucz1uYW5vVGltZSgpOyBsYXp5Lm1hdGNoZXIoIjEiLnJlcGVhdCggMTAwMTYwMDc5ICkpLm1hdGNoZXMoKTsgb3V0LnByaW50bG4oIkxhenkgU3RyaW5nIDogIisgTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKS1ucykpOwogICAgICAgIC8vbnM9bmFub1RpbWUoKTsgZ3JlZWR5Lm1hdGNoZXIoIjEiLnJlcGVhdCggMTAwMTYwMDc5ICkpLm1hdGNoZXMoKTsgb3V0LnByaW50bG4oIkdyZWVkeSBTdHJpbmc6IisgTkFOT1NFQ09ORFMudG9NaWxsaXMobmFub1RpbWUoKS1ucykpOwoKICAgIH0KCgoKCnN0YXRpYyBjbGFzcyBSZXAgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UKewogICAgU3RyaW5nIHN0ciA9IG51bGw7CiAgICBpbnQgICAgbGVuOwogICAgY2hhciAgYmFzZTsKCiAgICBwdWJsaWMgUmVwKGNoYXIgeCwgaW50IGNvdW50KQogICAgewogICAgICAgIHRoaXMubGVuICA9IGNvdW50OwogICAgICAgIHRoaXMuYmFzZSA9IHg7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgaW50IGxlbmd0aCgpCiAgICB7CiAgICAgICAgcmV0dXJuIGxlbjsKICAgIH0KCiAgICBAT3ZlcnJpZGUKICAgIHB1YmxpYyBjaGFyIGNoYXJBdChpbnQgaW5kZXgpCiAgICB7CiAgICAgICAgcmV0dXJuIGJhc2U7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgpCiAgICB7CiAgICAgICAgaWYgKGJlZ2luSW5kZXggPCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGJlZ2luSW5kZXgpOwogICAgICAgIH0KICAgICAgICBpZiAoZW5kSW5kZXggPiB0aGlzLmxlbikgewogICAgICAgICAgICB0aHJvdyBuZXcgU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihlbmRJbmRleCk7CiAgICAgICAgfQogICAgICAgIGludCBzdWJMZW4gPSBlbmRJbmRleCAtIGJlZ2luSW5kZXg7CiAgICAgICAgaWYgKHN1YkxlbiA8IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oc3ViTGVuKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgoYmVnaW5JbmRleCA9PSAwKSAmJiAoZW5kSW5kZXggPT0gdGhpcy5sZW4pKSA/IHRoaXMKICAgICAgICAgICAgICAgIDogbmV3IFJlcCh0aGlzLmJhc2UsIHN1Ykxlbik7CiAgICB9CgogICAgQE92ZXJyaWRlCiAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gbnVsbCE9c3RyID8gIHN0ciA6ICh0aGlzLnN0ciAgPSBuZXcgU3RyaW5nKG5ldyBjaGFyW117YmFzZX0pLnJlcGVhdChsZW4pKTsKICAgIH0KCiAKfQp9Cg==