https://www.acmicpc.net/problem/1620
정신나간 푸키먼 문제
어디서 만든걸 번역해온듯 한데
뭐 아무튼 해시 or 맵으로 간단하게 풀수있다.
다만 입력값이 100000개를 넘다 보니
io에 대해서 대비해놔야 한다
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
int N, M;
std::unordered_map<std::string, int> pokeHash;
std::vector<std::string> pokeVec;
void input()
{
std::cin >> N >> M;
pokeVec = std::vector<std::string>(N + 1);
pokeHash.reserve(N + 1);
std::string strInput;
for (int i = 1; i <= N; ++i)
{
std::cin >> strInput;
pokeHash[strInput] = i;
pokeVec[i] = strInput;
}
}
void solve()
{
std::string input;
for (int i = 0; i < M; ++i)
{
std::cin >> input;
int pokeNum = std::atoi(input.c_str());
if (pokeNum == 0)
{
std::cout << pokeHash[input];
}
else if (pokeNum <= N)
{
std::cout << pokeVec[pokeNum];
}
std::cout << '\n';
}
}
int main()
{
std::cin.tie(0);
std::cin.sync_with_stdio(false);
std::cout.tie(0);
std::cout.sync_with_stdio(false);
input();
solve();
return 0;
}
|
cs |
이걸 트라이로 푼다면 속도면에서는 통과가 가능하나
100000개의 단어별로 메모리를 확보해놓아야 한다.
메모리 초과가 뜨니 트라이 사용엔 유의할것
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
#include <iostream>
#include <unordered_map>
#include <vector>
#include <string>
struct Trie
{
Trie()
{
//memset(next, 0, sizeof(next));
for (int i = 0; i < 26; ++i)
{
next[i] = nullptr;
}
}
~Trie()
{
for (int i = 0; i < 26; ++i)
{
if (next[i])
{
delete next[i];
}
}
}
void insert(const char* word, const int num)
{
if (*word == '\0')
{
_num = num;
return;
}
int idx = *word - 'a';
if (next[idx] == nullptr)
{
next[idx] = new Trie;
}
next[idx]->insert(word + 1, num);
}
unsigned int find_num(const char* word)
{
if (*word == '\0')
{
return _num;
}
if (next[word[0] - 'a'] == nullptr)
{
return 0;
}
return next[word[0] - 'a']->find_num(word + 1);
}
public:
Trie* next[26];
unsigned int _num = 0;
};
Trie trieArr;
int N, M;
std::vector<std::string> pokeVec;
void input()
{
std::cin >> N >> M;
pokeVec = std::vector<std::string>(N + 1);
std::string strInput;
for (int i = 1; i <= N; ++i)
{
std::cin >> strInput;
pokeVec[i] = strInput;
strInput[0] = strInput[0] - 'A' + 'a';
trieArr.insert(strInput.c_str(), i);
}
}
void solve()
{
std::string input;
for (int i = 0; i < M; ++i)
{
std::cin >> input;
int pokeNum = std::atoi(input.c_str());
input[0] = input[0] - 'A' + 'a';
if (pokeNum == 0)
{
std::cout << trieArr.find_num(input.c_str());
}
else if (pokeNum <= N)
{
std::cout << pokeVec[pokeNum];
}
std::cout << '\n';
}
}
int main()
{
input();
solve();
return 0;
}
|
cs |
100000개의 단어, 길이별로 26개씩 할당을 하는데 이게 저마다 죄다 다른 단어면 메모리를 그만큼 많이 할당하니
문제가 생길 여지가 높다. 메모리 파악하는 눈치도 좀 키워야할텐데
일단 cin.tie 등과 같은 FastIO를 사용하면 된다.
혹은 scanf printf만 쓰거나
'알고리즘' 카테고리의 다른 글
koi : 타일 채우기(DP아님) (0) | 2020.08.19 |
---|---|
동적 계획법 (0) | 2020.08.19 |
koi : combinations(S) (0) | 2020.08.18 |
백준 1037 : 약수 (0) | 2020.08.14 |
백준 1316 : 그룹단어체커 (0) | 2020.08.14 |