SOLONG 문제 런타임에러 질문

  • KIMMUSIC
    KIMMUSIC

    트라이 문제 포인터 대신 배열로 구현했는데 런타임에러 뜨네요. 왜뜨는지 도저히 모르겠습니다.

    #include <iostream>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    
    using namespace std;
    
    const int GO_MAX = 26;
    const int CHA_MAX = 100000;
    vector<pair<int, string>> input;
    struct Trie {
        int cnt;
        int go[CHA_MAX + 1][GO_MAX];
        bool output[CHA_MAX + 1];
        bool goexist[CHA_MAX + 1];
        int id[CHA_MAX+1];
    
        Trie() {
            cnt = 1;
            memset(go, 0, sizeof go);
            memset(output, 0, sizeof output);
            memset(goexist, 0, sizeof goexist);
            memset(id, -1, sizeof id);
        }
    
        void insert(const char* key, int num, int node=0) {
            if (id[node] == -1) id[node] = num;
            if (*key == '\0')
            {
                output[node] = true;
                return;
            }
    
            int next = *key - 'A';
            if (!go[node][next]) go[node][next] = cnt++;
            goexist[node] = true;
            insert(key + 1, num, go[node][next]);
        }
    
        bool find(const char* key, int node = 0)
        {
            if (*key == '\0')
            {
                return true;
            }
    
            int next = *key - 'A';
            if (!go[node][next])
            {
                return false;
            }
    
            return find(key + 1, go[node][next]);
        }
    
        int type(const char* key, const char* originkey, int node=0) {
    
            if (*key == '\0') return 0;
            int next = *key - 'A';
    
            if (originkey == input[id[go[node][next]]].second)
            {
                return 1;
            }
    
            return type(key + 1, originkey, go[node][next]) + 1;
        }
    };
    
    int main(void)
    {
        int T;
        cin >> T;
    
        while (T--)
        {
            int N, P;
            cin >> N >> P;
            input.clear();
    
            bool result = true;
            Trie trie;
    
            for (int i = 0; i < N; ++i)
            {
                char tell[11];
                int num;
                cin >> tell >> num;
                input.push_back({ -num, tell });
            }
    
            sort(input.begin(), input.end());
    
    
            for (int i = 0; i < input.size(); ++i)
            {
                trie.insert(input[i].second.c_str(), i);
            }
            int sum = (P-1) + P;
            for (int i = 0; i < P; ++i)
            {
                char tell2[11];
                cin >> tell2;
                if (trie.find(tell2) == true)
                {
                    sum += min(trie.type(tell2, tell2), (int)(strlen(tell2)-1));
                }
                else
                {
                    sum += strlen(tell2) - 1;
                }
            }
    
            cout << sum << endl;
        }
    
        return 0;
    }
    

    3년 전
0개의 댓글이 있습니다.
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.