Pagini recente » Cod sursa (job #223583) | Cod sursa (job #2290844) | Cod sursa (job #1746044) | Atasamentele paginii aaaaaaaaaaaaaaaa | Cod sursa (job #3216948)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("trie.in");
ofstream cout("trie.out");
struct nod
{
int cnt = 0,cntflag = 0 ;
int next[28];
bool flag = false ;
nod()
{
fill(begin(next), end(next), -1);
}
};
vector<nod> trie;
void add (string s, vector<nod> &trie)
{
int start = 0;
for ( int i = 0 ; i < s.size() ; i ++ )
{
int val = s[i] - 'a';
if ( trie[start].next[val] == -1)
{
trie[start].next[val] = trie.size();
trie.emplace_back();
}
start = trie[start].next[val];
trie[start].cnt ++ ;
}
trie[start].flag = true;
trie[start].cntflag ++ ;
}
int cauta ( string s, vector<nod> &trie )
{
int start = 0 ;
int cnt = 1e9 ;
for (int i = 0 ; i < s.size() ; i ++ )
{
int val = s[i] - 'a';
if ( trie[start].next[val] == -1 || trie[trie[start].next[val]].cnt == 0 )
{
cnt = 0 ;
break ;
}
start = trie[start].next[val];
}
if ( cnt == 0 )
return 0 ;
return trie[start].cntflag;
}
void sterg (string s, vector<nod> &trie )
{
int start =0 ;
for ( int i = 0 ; i < s.size() ; i ++ )
{
int val = s[i] - 'a';
start = trie[start].next[val];
trie[start].cnt -- ;
}
trie[start].cntflag -- ;
}
int prefix(string s, vector<nod> &trie)
{
int start = 0 ;
int cnt = 0 ;
for ( int i = 0 ; i < s.size() ; i ++ )
{
int val = s[i] - 'a';
if ( trie[start].next[val] == -1 || trie[trie[start].next[val]].cnt == 0 )
break ;
cnt ++;
start = trie[start].next[val];
}
return cnt ;
}
int main()
{
trie.emplace_back();
int tip ;
while ( cin >> tip )
{
string x;
cin >> x;
if ( tip == 0 )
{
add(x,trie);
}
if ( tip == 1 )
sterg(x,trie);
if ( tip == 2)
{
cout << cauta (x,trie) << '\n';
}
if ( tip == 3 )
{
cout << prefix(x,trie) << '\n';
}
}
return 0;
}