Pagini recente » Cod sursa (job #1682663) | Cod sursa (job #3287639) | Cod sursa (job #2811075) | Cod sursa (job #1517376) | Cod sursa (job #1685868)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define nmax 100005
using namespace std;
struct ntrie
{
unsigned int nod;
char c;
};
unsigned int nou,op,rez;
vector <ntrie> T[nmax];
char s[25];
unsigned int frec[nmax];
unsigned int ex[nmax];
void make0()
{
unsigned int i,n,x=0,j;bool ok;
n=strlen(s);ntrie y;
for (i=0;i<n;i++)
{
for (j=0,ok=1;j<T[x].size()&&ok;j++)
{
if (T[x][j].c==s[i])
ok=0,x=T[x][j].nod;
}
if (ok)
{
nou++;
y.c=s[i];y.nod=nou;
T[x].push_back(y);
x=nou;
}
ex[x]++;
}
frec[x]++;
}
void make2()
{
unsigned int i,n,x=0,j;bool ok;
n=strlen(s);
for (i=0;i<n;i++)
{
for (j=0,ok=1;j<T[x].size()&&ok;j++)
{
if (T[x][j].c==s[i])
ok=0,x=T[x][j].nod;
}
if (op==1) ex[x]--;
}
if (op==1) frec[x]--;
else rez=frec[x];
}
queue <unsigned int> q;
void make3()
{
unsigned int i,n,x=0,j,nr=0;bool ok=0;
n=strlen(s);rez=0;
for (i=0;i<n&&(!ok);i++)
{
for (j=0,ok=1;j<T[x].size()&&ok;j++)
{
if (T[x][j].c==s[i])
ok=0,x=T[x][j].nod;
}
nr++;
if (ex[x]) rez=max(rez,nr);
}
}
int main()
{
ifstream f("trie.in");
ofstream g("trie.out");
ex[0]=1;
while (!f.eof())
{
f>>op>>s;
if (op==0)
{
make0();
}
else
if ( op==2 || op==1 )
{
make2();
if (op==2)
{
g<<rez<<'\n';
}
}
else
{
make3();
g<<rez<<'\n';
}
}
f.close();
g.close();
return 0;
}