Hello codeforces Let's say an F(string s) as the number of different substrings that s has. Which is the maximum F(string x) such that x at most has 100000 characters and a dictionary of 26 characters.
# | User | Rating |
---|---|---|
1 | tourist | 3985 |
2 | jiangly | 3814 |
3 | jqdai0815 | 3682 |
4 | Benq | 3529 |
5 | orzdevinwang | 3526 |
6 | ksun48 | 3517 |
7 | Radewoosh | 3410 |
8 | hos.lyric | 3399 |
9 | ecnerwala | 3392 |
9 | Um_nik | 3392 |
# | User | Contrib. |
---|---|---|
1 | cry | 169 |
2 | maomao90 | 162 |
2 | Um_nik | 162 |
4 | atcoder_official | 161 |
5 | djm03178 | 158 |
6 | -is-this-fft- | 157 |
7 | adamant | 155 |
8 | awoo | 154 |
8 | Dominater069 | 154 |
10 | luogu_official | 150 |
Hello codeforces Let's say an F(string s) as the number of different substrings that s has. Which is the maximum F(string x) such that x at most has 100000 characters and a dictionary of 26 characters.
Name |
---|
Is there a problem link
https://cp-algorithms.com/string/string-hashing.html in this tutorial you can learn how to find the number of distinct substrings using hashing.
It's complexity is O(N^2).
To solve this you can build a suffix tree of the original string S and count the amount of nodes on the tree. The complexity of this solution is O(N) if you use Ukkonen's algorithm to build the suffix tree.
Problem link: http://acm.timus.ru/problem.aspx?space=1&num=1590
another possible solution: https://www.geeksforgeeks.org/count-distinct-substrings-string-using-suffix-array/
here is the problem link
and here is the solution by me.
I know that there is a solution in O (N log N) with Suffix Array and LCP, but the real question is the maximum value that the F () function could reach in any string of at most 100,000 characters with a 26 letter dictionary.
I think that the more characters the string has, the less possibility there is that the function F () defined for every string of at most 100000 and with a 26-letter dictionary reaches its maximum value but I am not sure of the maximum value of the function F (). Which would suit me very well because I think I solve many problems depending on the maximum value of F ().
I wrote the Suffix Array solution, and generated a few random strings of length 100.000.
The maximal value of the number of substrings is
N * (N - 1) / 2 = 5000050000
, and all the random strings i generated had around4999700000
distinct substrings. It's almost 0.99995% of the maximal value we could get.If we think about it it's quite obvious why: as the string is random, there is virtually no chance that two different substrings of length >= 10 match (the probability of a colision is
1/26^10 = 7e-15 ~= 0
). So except for the small substrings of length 1, 2, ... 9 (which are 9 * N = 900000), all the remaining 4999500000 are distinct.So if your hope was that there are few such distinct substrings, sorry to break it down :(
Moreover, there's an obvious statement that there're no more than $$$26$$$ distinct substrings of size 1, $$$26^2$$$ of size 2 and $$$26^3$$$ of size 3.
N * (N - 1) // 2 - (N - 26) - (N - 1 - 26 * 26) - (N - 2 - 26 * 26 * 26)
equals4999668281
. You get almost that (if not exactly).