Cod sursa(job #1214848)

Utilizator mikeshadowIon Complot mikeshadow Data 31 iulie 2014 16:21:11
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <string.h>
#include <queue>
#include <math.h>
#include <set>
#include <stack>

#define min(a,b) ((a<b)?a:b)
#define max(a,b) ((a<b)?b:a)

using namespace std;

//#define TEST
#ifdef TEST
ifstream fin("input.txt");
ofstream fout("output.txt");
#else
ifstream fin("trie.in");
ofstream fout("trie.out");
#endif // TEST

struct trie
{
    trie *c[26];
    int x,y;
    bool b[26];
};

trie root;

string s;

void add(trie &cc, int i)
{
    if (i==s.length()) {cc.x++; cc.y++; return;}
	cc.y++;
    if (cc.b[s[i]-'a']) add(*cc.c[s[i]-'a'],i+1);
    else
    {
        cc.c[s[i]-'a'] = new trie();
        cc.b[s[i]-'a'] = true;
        add(*cc.c[s[i]-'a'],i+1);
    }
}

void del(trie &cc, int i)
{
    if (i==s.length()) {cc.x--; cc.y--; return;}
    del(*cc.c[s[i]-'a'],i+1);
	cc.y--;
	if (cc.y && (*cc.c[s[i]-'a']).y==0)
	{
		cc.b[s[i]-'a']=false;
	}
}

int tt(trie cc, int i)
{
    if (i==s.length()) {return cc.x;}
    if (cc.b[s[i]-'a']) return tt(*cc.c[s[i]-'a'],i+1);
    else
    {
        return 0;
    }
}

int pr(trie cc, int i)
{
    if (i==s.length()) return s.length();
    if (cc.b[s[i]-'a']) return pr(*cc.c[s[i]-'a'],i+1);
    else
    {
        return i;
    }
}

int main()
{
    root.x=1;
    while (!fin.eof())
    {
        int a;
        fin>>a;
        fin>>s;
        if (fin.eof()) break;
        if (a==0)
        {
            add(root,0);
        }
        else if (a==1)
        {
            del(root,0);
        }
        else if (a==2)
        {
            fout<<tt(root,0)<<'\n';
        }
        else
        {
            fout<<pr(root,0)<<'\n';
        }
    }
    return 0;
}