SOLONG 문제.. 어디서 오답이 나는걸까요?

  • skan1543
    skan1543
    #include<stdio.h>
    #include<string>
    #include<map>
    #include<string.h>
    #include<algorithm>
    
    using namespace std;
    
    int cnt = 0;
    bool needtoplus = 0;
    struct TREE {
        TREE *children[26];
        int max=-1;
    
        void insert(string &a,int i,int val)
        {
            if (max < val)
            {
                needtoplus = 0;
                max = val;
            }
            if (needtoplus) cnt++;
    
            int num = a[i]- 'A';
            if (children[num] == NULL){
                children[num] = new TREE();
            }
            if( i!=a.length()-1) children[num]->insert(a,i+1, val);
        }
    
    };
    
    struct QUERY {
        string word;
        int val;
        bool operator< (const QUERY &a)
        {
            if (val == a.val){
                return word.compare(a.word) < 0;
            }
            return val > a.val;
        }
    }; QUERY Q[10001];
    map<string, int> m;
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            int N, M,val;
            char temp[41];
            scanf("%d %d", &N, &M);
            for (int i = 0; i < N; i++)
            {
                scanf("%s %d", temp, &val);
                Q[i].word = temp;
                Q[i].val = val;
            }
            sort(Q, Q + N);
            TREE *root = new TREE();
            root->max = 999999;
    
            for (int i = 0; i < N; i++)
            {
                cnt = 0;
                needtoplus = 1;
                root->insert(Q[i].word,0, Q[i].val);
                Q[i].val = cnt;
                m[Q[i].word] = Q[i].val + !needtoplus;
            }
    
            int answer = 0;
    
            for (int i = 0; i < M; i++)
            {
                scanf("%s", temp);
                if(m.find(temp)!=m.end())answer += m[temp];
                else answer += strlen(temp);
            }
            printf("%d\n", answer + M - 1);
            m.clear();
            delete root;
    
        }
        return 0;
    }
    

    기본적인 아이디어는

    단어들의 빈도순으로 내림차순, 빈도가 같다면 사전순으로 정렬을 한뒤, 차례대로 트라이에 insert하면서 몇번의 입력을 해야 해당 단어를 얻을 수 있는지 연산을 하고, 그 결과를 map에 저장하여

    M개의 단어를 입력받으면서 바로바로 몇번의 입력을 해야 하는질 더해갔습니다. 별로 문제될게 없는것같은데.. 안되네요 ㅠㅠ


    8년 전
2개의 댓글이 있습니다.
  • hyunhwan
    hyunhwan

    다음 입력을 넣어보세요. 9가 나와야 합니다.

    1
    2 2
    AAAAAAAAA 10
    AAAA 10
    AAAAAAAAA AAAA
    


    8년 전 link
  • skan1543
    skan1543

    답변 감사합니다 (_ _)


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