Pagini recente » Cod sursa (job #1284569) | Cod sursa (job #2399629) | Cod sursa (job #3120697) | Cod sursa (job #2553437) | Cod sursa (job #1458406)
#include<fstream>
#include<string>
#include<vector>
using namespace std;
const int NMAX = 200000;
#define next fdfafdsdfa
int t[NMAX][26];
int nr[NMAX]; // nr[i] = numarul de cuvinte ce 'trec' prin nodul i
int endhere[NMAX]; // endhere[i] = numarul de cuvinte ce se termina in nodul i
// t[i][j] - nodul la care ajungem din nodul i plecand pe muchia cu litera j
// 0 - nodul radacina
int next=1; // numarul de noduri din trie la momentul curent
ifstream cin("trie.in");
ofstream cout("trie.out");
void init()
{
for (int i=0;i<NMAX;i++)
for (int j=0;j<26;j++) t[i][j]=-1;
}
void insereaza(string s)
{
int nod=0;
for (int i=0;i<(int)s.size();i++)
{
if (t[nod][s[i]-'a']==-1) nod = t[nod][s[i]-'a'] = next++;
else nod = t[nod][s[i]-'a'];
nr[nod]++;
}
endhere[nod]++;
}
void sterge(string s)
{
int nod=0;
for (int i=0;i<(int)s.size();i++)
{
nod=t[nod][s[i]-'a'];
nr[nod]--;
}
endhere[nod]--;
}
int prefix(string s)
{
int nod=0, ret=0;
for (int i=0;i<(int)s.size();i++)
{
if (t[nod][s[i]-'a']==-1) return ret;
nod = t[nod][s[i]-'a'];
if (nr[nod]) ret = i+1;
}
return ret;
}
int query(string s)
{
int nod=0;
for (int i=0;i<(int)s.size();i++)
{
if (t[nod][s[i]-'a']==-1) return 0;
nod=t[nod][s[i]-'a'];
}
return endhere[nod];
}
int main()
{
int tip; string s;
init();
while (cin>>tip>>s)
{
if (tip==0) insereaza(s);
if (tip==1) sterge(s);
if (tip==2) cout<<query(s)<<'\n';
if (tip==3) cout<<prefix(s)<<'\n';
}
cin.get();
return 0;
}