题目链接
这道题其实很简单,数据范围也不大,直接暴力 DFS 就可以了。但是我想试一试字典树。
但是要注意的是,由于每个字符串可以到达 100 个字符,最多共有50个字符串,所以变量 tot 和 u 最坏可以到达 50*100 = 5000 ,所以 trie 数组的第一维要开大一些。
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define ASC s[i]-'A'
int n,tot;
int trie[10005][26],num[105];
char s[105],a[26]={ 'A','B','C','D','E',
'F','G','H','I','J','K','L','M',
'N','O','P','Q','R','S','T','U',
'V','W','X','Y','Z'};
void insert(void){
int u=0;
for(int i=0;s[i];i++){
if(!trie[u][ASC])
trie[u][ASC] = ++tot;
u = trie[u][ASC];
}
return;
}
void search(void){
int u=0;
for(int i=0;s[i];i++){
if(!trie[u][ASC]) return;
u = trie[u][ASC];
}
for(int i=0;i<=25;i++)
if(trie[u][i]) num[i]++;
}
int main(void){
cin >> n;
for(int i=1;i<=n;i++){
cin >> s;
insert();
memset(s,0,sizeof(s));
}
cin >> s;
search();
cout << "***";
for(int i=0;i<=25;i++){
if(!num[i]) cout << '*';
else cout << a[i];
if(i==4 || i==12 || i==20) cout << endl;
}
cout << "***" << endl;
return 0;
}