C.智乃的Notepad(Easy version)
题目:智乃只能使用键盘上的 2626 个英文字母和退格符。在题干中,为了便于观察,我们使用 \b表示退格符,输入后会删除记事本上最后一个字符。现在有 n 个单词,编号从 1到 n,智乃有 m次查询,每次查询单词集合为l 到 r 时,要想在记事本上显示过所有单词,至少要敲几下键盘?
解析:用字典树,最大键数为全部不相同字符串长度*2-最长字符串长度
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+9;
string s[N];
int ch[N][26],idx=0;
void insert(string s)
{
int p=0;
for(int i=0;i<s.size();i++)
{
int j=s[i]-'a';
if(ch[p][j]==0) ch[p][j]=++idx;
p=ch[p][j];
}
}
void slove()
{
int n,m; cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i];
sort(s,s+n);
for(int i=0;i<m;i++)
{
int l,r; cin>>l>>r;
int maxd=0;
for(int i=l;i<=r;i++)
{
insert(s[i]);
maxd=max((int)s[i].size(),maxd);
}
cout<<idx*2-maxd;
}
}
int main()
{
int t=1;
while(t--)
{
slove();
}
}