티스토리 뷰
문제 링크 : https://www.acmicpc.net/problem/5052
5052번: 전화번호 목록
첫째 줄에 테스트 케이스의 개수 t가 주어진다. (1 ≤ t ≤ 50) 각 테스트 케이스의 첫째 줄에는 전화번호의 수 n이 주어진다. (1 ≤ n ≤ 10000) 다음 n개의 줄에는 목록에 포함되어 있는 전화번호가
www.acmicpc.net
트라이(trie) 기본 문제.
아호-코라식(Aho-Corasick) 알고리즘을 복습하기 전에 다시 풀어 봤다.
입력받은 문자열을 저장할 strs를 동적으로 할당하면 메모리는 많이 절약되지만 시간은 살짝 더 걸린다.
#include<bits/stdc++.h>
using namespace std;
vector<char*> strs;
struct trie {
char c; bool isEnd;
trie* children[10];
trie() : isEnd{false} {
for(int i=0;i<10;i++) children[i]=nullptr;
}
~trie() {
for(int i=0;i<10;i++) if(children[i]!=nullptr)
delete children[i];
}
void add(char *p){
if(*p==0) { isEnd=true; return;}
int id=*p-'0';
if(children[id]==nullptr)
children[id]=new trie();
children[id]->add(p+1);
}
bool recog(char *p){
if(*p==0) return true;
if(isEnd) return false;
int id=*p-'0';
return children[id]->recog(p+1);
}
} *rt;
void solve(){
int n; scanf("%d",&n);
strs=vector<char*>(n,nullptr);
for(int i=0;i<n;i++) {
strs[i]=new char[11];
scanf("%s", strs[i]);
}
rt=new trie();
for(int i=0;i<n;i++) rt->add(strs[i]);
bool ans=true;
for(int i=0;i<n;i++)
if(rt->recog(strs[i])==false) {
ans=false;
break;
}
if(!ans) printf("NO\n");
else printf("YES\n");
delete rt, rt=nullptr;
for(int i=0;i<n;i++) delete[] strs[i];
}
int main(){
int T; scanf("%d",&T);
while(T--)
solve();
}
반응형
'DS\Algo' 카테고리의 다른 글
BOJ 9250 문자열 집합 판별 (1) | 2022.10.03 |
---|---|
BOJ 17404 RGB 거리 2 (1) | 2022.10.03 |
BOJ 9084 동전 (1) | 2022.10.02 |
BOJ 22876 츠바메가에시 (1) | 2022.09.23 |
BOJ 2407 조합 (C++) (0) | 2022.09.20 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 다익스트라
- JavaScript
- C++ big number
- 세그먼트 트리
- Vim
- script
- stack
- lazy propagation
- map
- bash script
- Shell Programming
- dynamic programming
- javascript array
- math font
- 정수론
- fenwick tree
- segment tree
- persistent segment tree
- max flow
- Dijkstra
- RUBY
- Reference
- nearest common ancestor
- BOJ
- shell
- bash
- Aho-Corasick
- 백준
- python3
- number theory
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함