SOLONG 문제.. 어디서 오답이 나는걸까요? 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 다음 입력을 넣어보세요. 9가 나와야 합니다. 1 2 2 AAAAAAAAA 10 AAAA 10 AAAAAAAAA AAAA 8년 전 link skan1543 답변 감사합니다 (_ _) 8년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
skan1543
기본적인 아이디어는
단어들의 빈도순으로 내림차순, 빈도가 같다면 사전순으로 정렬을 한뒤, 차례대로 트라이에 insert하면서 몇번의 입력을 해야 해당 단어를 얻을 수 있는지 연산을 하고, 그 결과를 map에 저장하여
M개의 단어를 입력받으면서 바로바로 몇번의 입력을 해야 하는질 더해갔습니다. 별로 문제될게 없는것같은데.. 안되네요 ㅠㅠ
8년 전