Cod sursa(job #761038)

Utilizator a08iAndrei Ionescu a08i Data 24 iunie 2012 14:50:43
Problema Trie Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.31 kb
#include<cstdio>
#include<iostream>
#include<string>
#include<vector>

using namespace std;

class Vertex
{
  private:
  int words;
  int prefixes;
  vector <Vertex*> edges;

  public:
  Vertex()
  {
    words = 0;
    prefixes = 0;
  }

  ~Vertex()
  {
    while(!edges.empty())
    {
      delete edges.back();
      edges.pop_back();
    }

  }

  void print()
  {
    cout << "words " << words << endl;
    cout << "pref " << prefixes << endl;
    cout << "edges " << edges.size() << endl;
  }

  void addword(string word, int pos)
  {
    if(edges.size() == 0)
    {
      for(int i=0; i<26; i++)
      {
        edges.push_back(new Vertex);
      }
    }

    prefixes++;

    if(pos == word.size())
    {
      words++;
    }
    else
    {
      int nextvertex = word[pos] - 'a';
      (*edges[nextvertex]).addword(word,pos+1);
    }
  }

  void delword(string word, int pos)
  {
    prefixes--;

    if(pos == word.size())
    {
      words--;

      if(prefixes == 0)
      {
        while(!edges.empty())
        {
          delete edges.back();
          edges.pop_back();
        }
      }

    }
    else
    {
      int nextvertex = word[pos] - 'a';
      (*edges[nextvertex]).delword(word,pos+1);
    }
  }

  int countwords(string word, int pos)
  {

    if(pos == word.size())
    {
      return words;
    }
    if(edges.size() == 0)
    {
      return 0;
    }
    int nextvertex = word[pos] - 'a';
    return (*edges[nextvertex]).countwords(word, pos+1);
  }

  int maxprefix(string word, int pos, int maxsofar)
  {

    if(prefixes > 0)
    {
      maxsofar = pos;
    }

    if(pos == word.size() || edges.size() == 0)
    {
      return maxsofar;
    }

    // check next level
    int nextvertex = word[pos] - 'a';
    return (*edges[nextvertex]).maxprefix(word, pos+1, maxsofar);
  }

};

int main()
{

  freopen("trie.in", "r", stdin);
  freopen("trie.out", "w", stdout);

  int Type;
  char Word [80];

  Vertex * root = new Vertex;

  while (!feof(stdin))
  {
    scanf("%d %s ", &Type, Word);

    switch(Type)
    {
      case 0:
        (*root).addword(Word, 0);
        break;
      case 1:
        (*root).delword(Word, 0);
        break;
      case 2:
        printf("%d\n", (*root).countwords(Word, 0));
        break;
      case 3:
        printf("%d\n", (*root).maxprefix(Word, 0, 0));
        break;
    }
  }

  return 0;
}