Pagini recente » Cod sursa (job #3239501) | Borderou de evaluare (job #308519) | documentatie/arhiva-educationala | Borderou de evaluare (job #2695087) | Cod sursa (job #1412299)
#include<bits/stdc++.h>
using namespace std;
struct Trie {
int cnt, End;
Trie *fiu[26];
Trie() {
cnt = End = 0;
for(int i = 0; i < 26; ++ i)
fiu[i] = NULL;
}
};
Trie *T = new Trie;
char sir[50];
void Insert(Trie *Q)
{
for(int i = 0; sir[i]; ++ i) {
int CH = sir[i] - 'a';
if(!Q->fiu[CH])
Q->fiu[CH] = new Trie;
Q = Q->fiu[CH];
Q->cnt ++;
}
Q->End ++;
}
void Erase(Trie *Q, int i)
{
-- Q->cnt;
if(!sir[i]) {
-- Q->End;
return ;
}
Erase(Q->fiu[sir[i] - 'a'], i + 1);
}
int Query_1(Trie *Q)
{
for(int i = 0; sir[i]; ++ i) {
int CH = sir[i] - 'a';
if(!Q->fiu[CH])
return 0;
Q = Q->fiu[CH];
}
return Q->End;
}
int Query_2(Trie *Q)
{
int i;
for(i = 0; sir[i]; ++ i) {
int CH = sir[i] - 'a';
if(!Q->fiu[CH])
return i;
Q = Q->fiu[CH];
if(Q->cnt <= 1)
return i + 1;
}
return i;
}
int main()
{
freopen("trie.in" ,"r", stdin);
freopen("trie.out", "w", stdout);
int tip;
while(cin >> tip){
cin >> sir;
//cout << tip << " " << sir << "\n";
if(tip == 0)
Insert(T);
if(tip == 1)
Erase(T, 0);
if(tip == 2)
printf("%d\n", Query_1(T));
if(tip == 3)
printf("%d\n", Query_2(T));
}
return 0;
}