title: How can I make my trie more efficient?
body: <p>I'm working on a hacker rank problem and I <strong>believe</strong> my solution is correct. However, most of my test cases are being timed out. Could some one suggest how to improve the efficiency of my code?</p>
  
  <p>The important part of the code starts at the "Trie Class".</p>
  
  <p>The exact question can be found here: <a href="https://www.hackerrank.com/challenges/contacts" rel="nofollow">https://www.hackerrank.com/challenges/contacts</a></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.IO;
  class Solution
  {
      static void Main(String[] args)
      {
          int N = Int32.Parse(Console.ReadLine());
          string[,] argList = new string[N, 2];
          for (int i = 0; i &lt; N; i++)
          {
              string[] s = Console.ReadLine().Split();
              argList[i, 0] = s[0];
              argList[i, 1] = s[1];
          }
  
          Trie trie = new Trie();
  
          for (int i = 0; i &lt; N; i++)
          {
              switch (argList[i, 0])
              {
                  case "add":
                      trie.add(argList[i, 1]);
                      break;
                  case "find":
                      Console.WriteLine(trie.find(argList[i, 1]));
                      break;
                  default:
                      break;
              }
          }
      }
  }
  
  class Trie
  {
      Trie[] trieArray = new Trie[26];
      private int findCount = 0;
      private bool data = false;
      private char name;
  
      public void add(string s)
      {
          s = s.ToLower();
          add(s, this);
      }
  
      private void add(string s, Trie t)
      {
          char first = Char.Parse(s.Substring(0, 1));
          int index = first - 'a';
  
          if(t.trieArray[index] == null)
          {
              t.trieArray[index] = new Trie();
              t.trieArray[index].name = first;
          }
  
          if (s.Length &gt; 1)
          {
              add(s.Substring(1), t.trieArray[index]);
          }
          else
          {
              t.trieArray[index].data = true;
          }
      }
  
      public int find(string s)
      {
          int ans;
          s = s.ToLower();
          find(s, this);
  
          ans = findCount;
          findCount = 0;
          return ans;
      }
  
      private void find(string s, Trie t)
      {
          if (t == null)
          {
              return;
          }
          if (s.Length &gt; 0)
          {
              char first = Char.Parse(s.Substring(0, 1));
              int index = first - 'a';
              find(s.Substring(1), t.trieArray[index]);
          }
          else
          {
              for(int i = 0; i &lt; 26; i++)
              {
                  if (t.trieArray[i] != null)
                  {
                      find("", t.trieArray[i]);
                  }
              }
  
              if (t.data == true)
              {
                  findCount++;
              }
          }
      }
  
  }
  </code></pre>
  
  <p><strong>EDIT:</strong> I did some suggestions in the comments but realized that I can't replace s.Substring(1) with s[0]... because I actually need s[1..n]. AND s[0] returns a char so I'm going to need to do .ToString on it anyways.</p>
  
  <p>Also, to add a little more information. The idea is that it needs to count ALL names after a prefix for example.</p>
  
  <pre><code>Input: "He"
  Trie Contains:
  "Hello"
  "Help"
  "Heart"
  "Ha"
  "No"
  Output: 3
  </code></pre>