Pagini recente » Cod sursa (job #3260330) | Cod sursa (job #1461185) | Cod sursa (job #430163) | Rating Boicescu Theodor (Boicescu_Theodor) | Cod sursa (job #2875169)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
map<string,int>mp;
int fre[2000005];
int cara[2000005];
int noduri=0;
vector<int> adj[2000005];
void update (string s,int semn)
{
int curr,build,k,i,val,j;
curr=0;
for(i=0;i<s.size();i++)
{
build=1;
val=s[i]-'a';
for(j=0;j<adj[curr].size();j++)
{
k=adj[curr][j];
if(cara[k]==val)
{
build=0;
curr=k;
fre[k]=fre[k]+semn;
break;
}
}
if(build==1)
{
noduri++;
adj[curr].push_back(noduri);
fre[noduri]=semn;
cara[noduri]=val;
curr=noduri;
}
}
}
int querry (string s)
{
int curr,build,k,i,val,j;
curr=0;
for(i=0;i<s.size();i++)
{
build=1;
val=s[i]-'a';
for(j=0;j<adj[curr].size();j++)
{
k=adj[curr][j];
if(cara[k]==val)
{
build=0;
curr=k;
break;
}
}
if(build==1)
{
return i;
}
else if(fre[curr]<=0)
{
return i;
}
}
}
int main()
{
int n,i,j,k,tip;
ios_base::sync_with_stdio(false);
cin.tie(NULL);
string s;
while(cin>>tip>>s)
{
if(tip==0)
{
mp[s]++;
update(s,1);
}
else if(tip==1)
{
mp[s]--;
update(s,-1);
}
else if(tip==2)
{
cout<<mp[s]<<'\n';
}
else
{
cout<<querry(s)<<'\n';
}
}
return 0;
}