/* package whatever; // don't place package name! */
import java.util.* ;
import java.util.stream.* ;
import static java.util .stream .Collectors .*;
import java.io.* ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone {
// warm up + JIT
for ( int i = 10 ; i < 999 ; i++ )
time( i) ;
for ( int i = 10 ; i < 100001 ; i *= 10 )
System .
out .
format ( "Word length %d had time of %d per letter\n " , i, time
( i
) / i
) ; }
static long time( int length) {
long start
= System .
nanoTime ( ) ; for ( int i = 0 ; i < 10 ; i++ )
charFreq( random( length) ) .equals ( charFreq( random( length) ) ) ;
return System .
nanoTime ( ) - start
; }
static String random
( int length
) { return IntStream.
generate ( ( ) -> 'a' + ( int ) Math .
sqrt ( Math .
random ( ) * 26 * 26 ) ) .limit ( length)
.mapToObj ( i -> ( char ) i + "" )
.collect ( Collectors.joining ( "" ) ) ;
}
return charFreq( strA) .equals ( charFreq( strB) ) ;
}
return str.chars ( ) .boxed ( ) .collect ( groupingBy( i -> i, counting( ) ) ) ;
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS4qOwppbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy4qOwppbXBvcnQgamF2YS5pby4qOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZSB7CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CgkJLy8gd2FybSB1cCArIEpJVAogICAgICAgIGZvciAoaW50IGkgPSAxMDsgaSA8IDk5OTsgaSsrKQogICAgICAgICAgICB0aW1lKGkpOyAKICAgICAgICBUaHJlYWQueWllbGQoKTsgCiAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7IAogICAgICAgIGZvciAoaW50IGkgPSAxMDsgaSA8IDEwMDAwMTsgaSAqPSAxMCkKICAgICAgICAgICAgU3lzdGVtLm91dC5mb3JtYXQoIldvcmQgbGVuZ3RoICVkIGhhZCB0aW1lIG9mICVkIHBlciBsZXR0ZXJcbiIsIGksIHRpbWUoaSkgLyBpKTsKICAgfQoKICAgIHN0YXRpYyBsb25nIHRpbWUoaW50IGxlbmd0aCkgewogICAgICAgIGxvbmcgc3RhcnQgPSBTeXN0ZW0ubmFub1RpbWUoKTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspCiAgICAgICAgICAgIGNoYXJGcmVxKHJhbmRvbShsZW5ndGgpKS5lcXVhbHMoY2hhckZyZXEocmFuZG9tKGxlbmd0aCkpKTsKICAgICAgICByZXR1cm4gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKICAgIH0KICAgIAogICAgc3RhdGljIFN0cmluZyByYW5kb20oaW50IGxlbmd0aCkgewogICAgICAgIHJldHVybiBJbnRTdHJlYW0uZ2VuZXJhdGUoKCkgLT4gJ2EnICsgKGludClNYXRoLnNxcnQoTWF0aC5yYW5kb20oKSAqIDI2ICogMjYpKQogICAgICAgIC5saW1pdChsZW5ndGgpCiAgICAgICAgLm1hcFRvT2JqKGkgLT4gKGNoYXIpaSArICIiKQogICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiIikpOwogICAgfQoKICAgIHN0YXRpYyBib29sZWFuIGFuYWdyYW0oU3RyaW5nIHN0ckEsIFN0cmluZyBzdHJCKSB7CiAgICAgICAgcmV0dXJuIGNoYXJGcmVxKHN0ckEpLmVxdWFscyhjaGFyRnJlcShzdHJCKSk7CiAgICB9CgogICAgc3RhdGljIE1hcDxJbnRlZ2VyLCBMb25nPiBjaGFyRnJlcShTdHJpbmcgc3RyKSB7CiAgICAgICAgcmV0dXJuIHN0ci5jaGFycygpLmJveGVkKCkuY29sbGVjdChncm91cGluZ0J5KGkgLT4gaSwgY291bnRpbmcoKSkpOwogICAgfQoKfQ==