Pagini recente » Cod sursa (job #1019242) | Cod sursa (job #2342112) | Cod sursa (job #927248) | Cod sursa (job #1357165) | Cod sursa (job #1886036)
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
const int sigma = 26;
const int NMAX = 100000;
string cuv;
struct nod
{
int v[sigma];
int x,y;
} nul;
vector <nod> g;
void add()
{
int x=1;
for(int i=0; i<(int)cuv.size(); i++)
{
if(g[x].v[cuv[i]-'a']==0)
{
g.push_back(nul);
g[x].v[cuv[i]-'a']=g.size()-1;
}
g[x].y++;
x=g[x].v[cuv[i]-'a'];
}
g[x].y++;
g[x].x++;
}
void del()
{
int x=1;
for(int i=0; i<(int)cuv.size(); i++)
{
g[x].y--;
x=g[x].v[cuv[i]-'a'];
}
g[x].y--;
g[x].x--;
}
void query1()
{
int x=1;
for(int i=0; i<(int)cuv.size(); i++)
{
if(g[x].v[cuv[i]-'a']==0)
{
out<<0<<'\n';
return;
}
else
{
x=g[x].v[cuv[i]-'a'];
}
}
out<<g[x].x<<'\n';
}
void query2()
{
int x=1;
for(int i=0; i<(int)cuv.size(); i++)
{
if (g[x].y==0)
{
out << i << "\n";
return;
}
else if(g[x].v[cuv[i]-'a']==0)
{
out<<i-1<<'\n';
return;
}
x=g[x].v[cuv[i]-'a'];
}
out<<g[x].y<<'\n';
}
int main()
{
for(int i=0; i<sigma; i++)
{
nul.v[i]=0;
}
nul.x=0;
nul.y=0;
g.push_back(nul);
g.push_back(nul);
int op;
while(in>>op)
{
in>>cuv;
if(op==0)
{
add();
}
else if(op==1)
{
del();
}
else if(op==2)
{
query1();
}
else
{
query2();
}
}
return 0;
}