前言
刚刚 2分钟 没写出来 又不熟练了
所以记录一下
做法
- 通过 son[N][26] 建立一颗树 通过cnt[N] 记录 以当前结尾的串个数 通过idx来区别其他串
基本操作步骤就是
for(int i = 0 ; i<len; i++)
{
int u = s[i]-'a';
if(!son[p][u])
{
son[p][u] = ++idx;
}
p=son[p][u];
}
cnt[p] ++;
CODE:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4+10;
int cnt[N],idx,son[N][26];
void insert(string s)
{
int len = s.size();
int p = 0;
for(int i = 0 ; i<len; i++)
{
int u = s[i]-'a';
if(!son[p][u])
{
son[p][u] = ++idx;
}
p=son[p][u];
}
cnt[p] ++;
}
void query(string s)
{
int len = s.size();
int p = 0;
for(int i = 0 ; i<len; i++)
{
int u = s[i]-'a';
if(!son[p][u])
{
cout<<0<<endl;
return;
}
p = son[p][u];
// cnt[p] ++;
}
cout<<cnt[p]<<endl;
}
void solve()
{
char op;
cin>>op;
string s;
cin>>s;
if(op == 'I')
insert(s);
else
query(s);
}
int main()
{
int t;
cin>>t;
while(t -- )
{
solve();
}
return 0;
}