[C++]白俊14426号:接頭辞の検索
質問リンク
14426:接頭辞の検索
問題の概要
N個の文字列、M個の文字列を与えます.M文字列では、集合Sに含まれる少なくとも1つの接頭辞の個数を求める必要がある.
方法
簡単な答えはありましたが練習としてTrieで近づけましたすべてのN文字列をtrieに挿入し、trieからM文字列にアクセスしようとします.アクセス中にNULLノードに遭遇した場合はfalseを返し、trieから文字列の末尾に到達した場合はtrueを返します.この場合、true文字列の数を出力できます.
コード#コード#
#include <bits/stdc++.h>
using namespace std;
struct Trie {
Trie* node[26];
Trie() {
for (int i = 0; i < 26; i++) node[i] = NULL;
}
void insert(string& str, int idx) {
if (idx == str.size())
return;
if (node[str[idx] - 'a'] == NULL)
node[str[idx] - 'a'] = new Trie();
node[str[idx] - 'a']->insert(str, idx + 1);
}
bool find(string& str, int idx) {
if (idx == str.size())
return true;
if (node[str[idx] - 'a'] == NULL)
return false;
return node[str[idx] - 'a']->find(str, idx + 1);
}
void clear(void) {
for (int i = 0; i < 26; i++) {
if (node[i] != NULL) {
node[i]->clear();
delete node[i];
}
}
}
};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n, m;
cin >> n >> m;
Trie* root = new Trie();
for (int i = 0; i < n; i++) {
string str;
cin >> str;
root->insert(str, 0);
}
int ans = 0;
for (int i = 0; i < m; i++) {
string str;
cin >> str;
if (root->find(str, 0))
ans++;
}
cout << ans << '\n';
root->clear();
delete root;
return 0;
}
Reference
この問題について([C++]白俊14426号:接頭辞の検索), 我々は、より多くの情報をここで見つけました https://velog.io/@beclever/C-백준-5052번-전화번호-목록-muqebko7テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol