Pagini recente » Cod sursa (job #2784785) | Cod sursa (job #761043)
Cod sursa(job #761043)
#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--;
}
else
{
int nextvertex = word[pos] - 'a';
(*edges[nextvertex]).delword(word,pos+1);
}
if(prefixes == 0)
{
while(!edges.empty())
{
delete edges.back();
edges.pop_back();
}
}
}
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;
}