<p>You are <strong>building</strong> a string <code>s</code> of length <code>n</code> <strong>one</strong> character at a time, <strong>prepending</strong> each new character to the <strong>front</strong> of the string. The strings are labeled from <code>1</code> to <code>n</code>, where the string with length <code>i</code> is labeled <code>s<sub>i</sub></code>.</p>

<ul>
	<li>For example, for <code>s = &quot;abaca&quot;</code>, <code>s<sub>1</sub> == &quot;a&quot;</code>, <code>s<sub>2</sub> == &quot;ca&quot;</code>, <code>s<sub>3</sub> == &quot;aca&quot;</code>, etc.</li>
</ul>

<p>The <strong>score</strong> of <code>s<sub>i</sub></code> is the length of the <strong>longest common prefix</strong> between <code>s<sub>i</sub></code> and <code>s<sub>n</sub></code> (Note that <code>s == s<sub>n</sub></code>).</p>

<p>Given the final string <code>s</code>, return<em> the <strong>sum</strong> of the <strong>score</strong> of every </em><code>s<sub>i</sub></code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;babab&quot;
<strong>Output:</strong> 9
<strong>Explanation:</strong>
For s<sub>1</sub> == &quot;b&quot;, the longest common prefix is &quot;b&quot; which has a score of 1.
For s<sub>2</sub> == &quot;ab&quot;, there is no common prefix so the score is 0.
For s<sub>3</sub> == &quot;bab&quot;, the longest common prefix is &quot;bab&quot; which has a score of 3.
For s<sub>4</sub> == &quot;abab&quot;, there is no common prefix so the score is 0.
For s<sub>5</sub> == &quot;babab&quot;, the longest common prefix is &quot;babab&quot; which has a score of 5.
The sum of the scores is 1 + 0 + 3 + 0 + 5 = 9, so we return 9.</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> s = &quot;azbazbzaz&quot;
<strong>Output:</strong> 14
<strong>Explanation:</strong> 
For s<sub>2</sub> == &quot;az&quot;, the longest common prefix is &quot;az&quot; which has a score of 2.
For s<sub>6</sub> == &quot;azbzaz&quot;, the longest common prefix is &quot;azb&quot; which has a score of 3.
For s<sub>9</sub> == &quot;azbazbzaz&quot;, the longest common prefix is &quot;azbazbzaz&quot; which has a score of 9.
For all other s<sub>i</sub>, the score is 0.
The sum of the scores is 2 + 3 + 9 = 14, so we return 14.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= s.length &lt;= 10<sup>5</sup></code></li>
	<li><code>s</code> consists of lowercase English letters.</li>
</ul>

class Solution:
    def sumScores(self, s: str) -> int:
        # def longest_lcp(s1,s):
        #     ans = 0
        #     size = min(len(s1),len(s))
        #     for i in range(size):
        #         if s1[i]==s[i]:
        #             ans+=1
        #         else:
        #             break
        #     return ans
        def getZarr(string, z):
            n = len(string)

            # [L,R] make a window which matches
            # with prefix of s
            l, r, k = 0, 0, 0
            for i in range(1, n):

                # if i>R nothing matches so we will calculate.
                # Z[i] using naive way.
                if i > r:
                    l, r = i, i

                    # R-L = 0 in starting, so it will start
                    # checking from 0'th index. For example,
                    # for "ababab" and i = 1, the value of R
                    # remains 0 and Z[i] becomes 0. For string
                    # "aaaaaa" and i = 1, Z[i] and R become 5
                    while r < n and string[r - l] == string[r]:
                        r += 1
                    z[i] = r - l
                    r -= 1
                else:

                    # k = i-L so k corresponds to number which
                    # matches in [L,R] interval.
                    k = i - l

                    # if Z[k] is less than remaining interval
                    # then Z[i] will be equal to Z[k].
                    # For example, str = "ababab", i = 3, R = 5
                    # and L = 2
                    if z[k] < r - i + 1:
                        z[i] = z[k]

                    # For example str = "aaaaaa" and i = 2, 
                    # R is 5, L is 0
                    else:

                        # else start from R and check manually
                        l = i
                        while r < n and string[r - l] == string[r]:
                            r += 1
                        z[i] = r - l
                        r -= 1

        z=[0]*len(s)
        getZarr(s,z)
        temp = ""
        ans = 0
        for i in range(len(s)-1,-1,-1):
            temp=s[i]+temp
            t=z[i]
            ans+=t
        return ans+len(s)

        
566