<p>A <strong>valid encoding</strong> of an array of <code>words</code> is any reference string <code>s</code> and array of indices <code>indices</code> such that:</p>

<ul>
	<li><code>words.length == indices.length</code></li>
	<li>The reference string <code>s</code> ends with the <code>&#39;#&#39;</code> character.</li>
	<li>For each index <code>indices[i]</code>, the <strong>substring</strong> of <code>s</code> starting from <code>indices[i]</code> and up to (but not including) the next <code>&#39;#&#39;</code> character is equal to <code>words[i]</code>.</li>
</ul>

<p>Given an array of <code>words</code>, return <em>the <strong>length of the shortest reference string</strong> </em><code>s</code><em> possible of any <strong>valid encoding</strong> of </em><code>words</code><em>.</em></p>

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

<pre>
<strong>Input:</strong> words = [&quot;time&quot;, &quot;me&quot;, &quot;bell&quot;]
<strong>Output:</strong> 10
<strong>Explanation:</strong> A valid encoding would be s = <code>&quot;time#bell#&quot; and indices = [0, 2, 5</code>].
words[0] = &quot;time&quot;, the substring of s starting from indices[0] = 0 to the next &#39;#&#39; is underlined in &quot;<u>time</u>#bell#&quot;
words[1] = &quot;me&quot;, the substring of s starting from indices[1] = 2 to the next &#39;#&#39; is underlined in &quot;ti<u>me</u>#bell#&quot;
words[2] = &quot;bell&quot;, the substring of s starting from indices[2] = 5 to the next &#39;#&#39; is underlined in &quot;time#<u>bell</u>#&quot;
</pre>

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

<pre>
<strong>Input:</strong> words = [&quot;t&quot;]
<strong>Output:</strong> 2
<strong>Explanation:</strong> A valid encoding would be s = &quot;t#&quot; and indices = [0].
</pre>

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

<ul>
	<li><code>1 &lt;= words.length &lt;= 2000</code></li>
	<li><code>1 &lt;= words[i].length &lt;= 7</code></li>
	<li><code>words[i]</code> consists of only lowercase letters.</li>
</ul>

from collections import defaultdict

class TrieNode:
    def __init__(self):
        self.children={}

class Trie:
    def __init__(self):
        self.root=TrieNode()
        self.ends=[]

    def insert(self,word):
        node=self.root
        for letter in word:
            if letter in node.children:
                node=node.children[letter]
            else:
                node.children[letter]=TrieNode()
                node=node.children[letter]

        self.ends.append((node,len(word)+1))

class Solution:
    def minimumLengthEncoding(self, words: List[str]) -> int:
        """
        words=list(set(words))
        words.sort(key=len)
        valid_words=[]
        ignor_words=[]
        for i in range(len(words)):
            if words[i] not in valid_words:
                if words[i] not in ignor_words:
                    j=i+1
                    while j<len(words) and words[i]!=words[j][-len(words[i]):]:
                        j+=1
                    if j<len(words):
                        ignor_words.append(words[i])
                    else:
                        valid_words.append(words[i])
        s="#".join(valid_words)
        return len(s)+1
        """

        words=set(words)
        words=[word[::-1] for word in words]

        trie=Trie()
        for word in words:
            trie.insert(word)

        return sum (length for node,length in trie.ends if len(node.children)==0)


        
19300