Pagini recente » Diferente pentru preoni-2008/runda-1/solutii intre reviziile 27 si 28 | Monitorul de evaluare | Cod sursa (job #1768554) | Monitorul de evaluare | Cod sursa (job #808549)
Cod sursa(job #808549)
#include<cstdio>
using namespace std;
struct trie
{
trie *N[26];
int S,C;
trie()
{
C=S=0;
for(int i=0;i<26;i++) N[i]=0;
}
};
trie *A,*R,*Q,*ST[100010];
char line[33],*p;
int i,j;
void insertWord(char *cuv)
{
for(p=cuv,Q=R;*p;p++)
{
i=*p-'a';
if(!Q->N[i]) Q->N[i]=new trie;
Q=Q->N[i];
Q->S++;
}
Q->C++;
}
void deleteWord(char *cuv)
{
j=0;
for(p=cuv,Q=R;*p;p++)
{
i=*p-'a';
Q=Q->N[i];
ST[++j]=Q;
Q->S--;
}
Q->C--;
for(;j;)
{
if(!ST[j]->S)
{
ST[j-1]->N[cuv[j-1]-'a']=0;
j--;
delete ST[j];
}
else break;
}
}
void writeAppearances(char *cuv)
{
for(p=cuv,Q=R;*p;p++)
{
i=*p-'a';
Q=Q->N[i];
if(!Q) break;
}
if(Q) printf("%d\n",Q->C);
else printf("0\n");
}
void writePrefix(char *cuv)
{
int lenght=0;
for(p=cuv,Q=R;*p;p++)
{
i=*p-'a';
Q=Q->N[i];
if(!Q) break;
lenght++;
}
printf("%d\n",lenght);
}
int main()
{
freopen("trie.in","r",stdin);
freopen("trie.out","w",stdout);
R=new trie;
while(!feof(stdin))
{
fgets(line,32,stdin);
switch(line[0]-'0')
{
case 0: {insertWord(line+2); break;}
case 1: {deleteWord(line+2); break;}
case 2: {writeAppearances(line+2); break;}
case 3: {writePrefix(line+2); break;}
}
}
return 0;
}