문제
문자열 S의 접두사란 S의 가장 앞에서부터 부분 문자열을 의미한다. 예를 들어, S = "codeplus"의 접두사는 "code", "co", "codepl", "codeplus"가 있고, "plus", "s", "cude", "crud"는 접두사가 아니다.
총 N개의 문자열로 이루어진 집합 S가 주어진다.
입력으로 주어지는 M개의 문자열 중에서 집합 S에 포함되어 있는 문자열 중 적어도 하나의 접두사인 것의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 문자열의 개수 N과 M (1 ≤ N ≤ 10,000, 1 ≤ M ≤ 10,000)이 주어진다.
다음 N개의 줄에는 집합 S에 포함되어 있는 문자열이 주어진다.
다음 M개의 줄에는 검사해야 하는 문자열이 주어진다.
입력으로 주어지는 문자열은 알파벳 소문자로만 이루어져 있으며, 길이는 500을 넘지 않는다. 집합 S에 같은 문자열이 여러 번 주어지는 경우는 없다.
출력
첫째 줄에 M개의 문자열 중에 총 몇 개가 포함되어 있는 문자열 중 적어도 하나의 접두사인지 출력한다.
예제 입력 1 복사
5 10
baekjoononlinejudge
startlink
codeplus
sundaycoding
codingsh
baekjoon
star
start
code
sunday
coding
cod
online
judge
plus
예제 출력 1 복사
7
# https://www.acmicpc.net/problem/14426
'''
1. 아이디어 :
1) Trie 로 풀면된다. 각각 노드에 Hashmap과 끝을 알리는 변수를 만들어서 저장하고,
끝나는 노드에는 변수를 True를 저장한다.
2. 시간복잡도 :
1) O(n) * O(1) + O(n) * O(1) = O(n)
- Trie에 저장하는 시간 + Trie에서 찾는 시간 * O(1)은 Trie에서 찾는 시간
3. 자료구조 :
1) Trie
'''
import sys
input = sys.stdin.readline
class TrieNoode:
def __init__(self):
self.children={}
self.endOfWord=False
class Trie:
def __init__(self):
self.root=TrieNoode()
def insert(self, word):
cur = self.root
for char in word:
if char not in cur.children:
cur.children[char] = TrieNoode()
cur = cur.children[char]
def search(self, word):
cur = self.root
for char in word:
if char not in cur.children:
return False
cur = cur.children[char]
return cur.endOfWord
def startsWith(self, prefix):
cur = self.root
for char in prefix:
if char not in cur.children:
return False
cur = cur.children[char]
return True
n, m = map(int, input().split())
trie = Trie()
for _ in range(n):
trie.insert(input().rstrip())
cnt = 0
for _ in range(m):
if trie.startsWith(input().rstrip()):
cnt += 1
print(cnt)
'알고리즘 문제 > 백준' 카테고리의 다른 글
휴대폰 자판 #5670 (0) | 2023.01.20 |
---|---|
전화번호 목록 #5052 (1) | 2023.01.18 |
개똥벌레 #3020 (0) | 2023.01.17 |
유기농 배추 #1012 (0) | 2023.01.15 |
최솟값 찾기 #11003 (1) | 2023.01.14 |