[BOJ] ์ฉ๋ ๋ถ์กฑ(5446)
[๋ฐฑ์ค(BOJ)] ์ฉ๋ ๋ถ์กฑ(5446) C++
๋ฌธ์ : BOJ_5446๋ฒ ์ฉ๋ ๋ถ์กฑ
๋ฌธ์ ์ค๋ช
Trie
ํธ๋ผ์ด๋ฅผ ์์ฉํด์ผ ํ ์ ์๋ ๋ฌธ์ ์
๋๋ค.
์ง์์ผ ํ๋ ํ์ผ๊ณผ ์ง์ฐ๋ฉด ์ ๋๋ ํ์ผ์ด ๋ชจ๋ ์ฃผ์์ง๋๋ฐ,
์์ผ๋์นด๋ *
๋ฅผ ์ ์ผ ๋์๋ง ์ฌ์ฉํ์ฌ ์ง์ธ ์ ์์ ๋,
์ง์์ผ ํ๋ ํ์ผ์ ๋ชจ๋ ์ง์ธ ์ ์๋ ์ต์์ ํ์๋ฅผ ๊ตฌํด์ผ ํฉ๋๋ค.
Solution
ํธ๋ผ์ด์ ํน์ฑ์, ๋ฌธ์์ด์ ์์๊ฐ ์์ ํธ๋ผ์ด ๋
ธ๋๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์,
boolํ ๋ณ์๋ฅผ ํ๋ ์ ์ธํด์ ์ฒ์์ ์ง์์ผ ํ๋ ํ์ผ ์ด๋ฆ์ ํธ๋ผ์ด์ ํ๋์ฉ ๋ฑ๋กํ ๋๋ง๋ค
ํ ๊ธ์, ํ ๊ธ์ boolํ์ true๋ก ํด์ค๋๋ค.
๊ทธ ๋ค ์ง์ฐ๋ฉด ์ ๋๋ ํ์ผ์ ๋ฑ๋กํ ๋, ํธ๋ผ์ด์ ํ ๊ธ์, ํ ๊ธ์ ๋ชจ๋ boolํ์ false๋ก ํด์ค๋๋ค.
ํธ๋ผ์ด๋ฅผ ์ํํ๋ฉด์ true์ธ ๋
ธ๋๊ฐ ๋ณด์ด๋ฉด ํด๋น ๋
ธ๋์ ์์๋ค์ ๋ชจ๋ ์ญ์ ํ๊ณ ํ์๋ฅผ ์นด์ดํธํด์ค๋๋ค.
Description
์ง์ธ ์ ์๋ ์ฌ๋ถ์ธ boolํ์ ok
๋ผ๋ ๋ณ์๋ก ์ ์ธํ์ต๋๋ค.
#include <iostream>
using namespace std;
int swc,res,tk,n,m;
struct Trie {
Trie *next[128];
bool finish;
bool ok;
bool first_ok;
Trie() {
fill(next, next + 128, nullptr);
finish = false;
ok = false;
}
~Trie() {
for (int i = 0; i < 128; i++) if (next[i]) delete next[i];
}
void insert(const char *key) {
if (*key == '\0') {
finish = true;
if (!swc) ok = true;
else ok = false;
return;
}
if (!swc) {
ok = true;
}
else ok = false;
int curr = *key;
if (next[curr] == nullptr) next[curr] = new Trie();
next[curr]->insert(key + 1);
}
void find() {
if (ok) {
res++;
return;
}
else if (finish) res++;
for (int i = 0; i < 128; i++) {
if (next[i]) next[i]->find();
}
}
};
int main(void) {
scanf("%d", &tk);
while (tk--) {
Trie *root = new Trie();
scanf("%d", &n);
for (int i = 0; i < n; i++) {
char str[21];
scanf(" %s", str);
root->insert(str);
}
scanf("%d", &m);
swc = 1;
for (int i = 0; i < m; i++) {
char str[21];
scanf(" %s", str);
root->insert(str);
}
root->find();
printf("%d\n", res-m);
res = 0;
swc = 0;
delete root;
}
}