티스토리 뷰

 

문제 링크 : 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
링크
«   2025/05   »
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
글 보관함