Pagini recente » Cod sursa (job #2538734) | Cod sursa (job #1286328) | Cod sursa (job #677927) | Cod sursa (job #1179873) | Cod sursa (job #1538319)
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
struct trie
{
trie *next[27];
int x;
bool ok;
trie() {
x = 0;
for (int i = 0; i < 26; i++)
next[i] = NULL;
ok = true;
}
};
trie *r;
void insert_str(string s)
{
trie *aux = r;
for (int i = 0; i < s.size(); i++)
{
if (aux->next[s[i] - 'a'] == NULL)
{
aux->next[s[i] - 'a'] = new trie();
}
aux = aux->next[s[i]-'a'];
aux->ok = true;
}
aux->x = aux->x + 1;
}
void delete_str(string s)
{
trie *aux = r, *ant;
for (int i = 0; i < s.size(); i++)
{
ant = aux;
aux = aux->next[s[i]-'a'];
}
aux->x = aux->x - 1;
if (aux->x == 0) {
for (int i = 0; i < 26; i++)
if (aux->next[i] != NULL && aux->next[i]->ok == true) return;
aux->ok = false;
}
}
int count_str(string s)
{
trie *aux = r;
for (int i = 0; i < s.size(); i++)
{
if (aux->next[s[i] - 'a'] == NULL)
{
return 0;
}
aux = aux->next[s[i]-'a'];
}
return aux->x;
}
int lcs_str(string s)
{
trie *aux = r;
for (int i = 0; i < s.size(); i++)
{
if (aux->next[s[i] - 'a'] == NULL || aux->next[s[i] - 'a']->ok == false)
{
return i;
}
aux = aux->next[s[i]-'a'];
}
return s.size();
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
string s;
r = new trie();
int op;
while (f>>op>>s)
{
if (op==0)
{
insert_str(s);
}
if (op==1)
{
delete_str(s);
}
if (op==2)
{
g<<count_str(s)<<'\n';
}
if (op==3)
{
g<<lcs_str(s)<<'\n';
}
}
}