FANMEETING 책대로 했는데 왜 오답나오죠? ㅠㅠ

  • cjkis
    cjkis

    https://algospot.com/judge/problem/read/FANMEETING

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    vector<int> results;
    
    void normalize(vector<int>& num){
        int numSize=num.size();
        num.push_back(0);
        for(int i=0; i<numSize; i++){
            if(num[i]<0){
                int borrow=(abs(num[i])+9)/10;
                num[i+1]-=borrow;
                num[i]+=borrow*10;
            } else{
                num[i+1]+=num[i]/10;
                num[i]%=10;
            }
        }
        while(num.size()>1 && num.back()==0)
            num.pop_back();
    }
    
    vector<int> multiply(const vector<int>& n1, const vector<int>& n2){
        vector<int> resultNo(n1.size()+n2.size()+1, 0);
        for(int i=0; i<n1.size(); i++){
            for(int j=0; j<n2.size(); j++){
                resultNo[i+j]+=n1[i]*n2[j];
            }
        }
        //normalize(resultNo);
        return resultNo;
    }
    
    void addTo(vector<int>& a, const vector<int>& b, int k){
        a.resize(max(a.size(), b.size() + k));  
        for(int i = 0; i < b.size(); i++) a[i+k] += b[i];  
        normalize(a); 
    }
    
    void subFrom(vector<int>& a, const vector<int>& b){
        a.resize(max(a.size(), b.size()) + 1);  
        for(int i = 0; i < b.size(); i++) a[i] -= b[i];  
        normalize(a);  
    }
    
    vector<int> karatsuba(const vector<int>& a, const vector<int>& b){
        int an = a.size(), bn = b.size();  
        // a 가 b 보다 짧을 경우 둘을 바꾼다  
        if(an < bn) return karatsuba(b, a);  
        // 기저 사례: a 나 b 가 비어 있는 경우  
        if(an == 0 || bn == 0) return vector<int>();  
        // 기저 사례: a 가 비교적 짧은 경우 O(n^2) 곱셈으로 변경한다.  
        if(an <= 50) return multiply(a, b);  
    
        int half = an / 2;  
        // a 와 b 를 밑에서 half 자리와 나머지로 분리한다  
        vector<int> a0(a.begin(), a.begin() + half);  
        vector<int> a1(a.begin() + half, a.end());  
        vector<int> b0(b.begin(), b.begin() + min<int>(b.size(), half));  
        vector<int> b1(b.begin() + min<int>(b.size(), half), b.end());  
        // z2 = a1 * b1  
        vector<int> z2 = karatsuba(a1, b1);  
        // z0 = a0 * b0  
        vector<int> z0 = karatsuba(a0, b0);  
        // a0 = a0 + a1; b0 = b0 + b1  
        addTo(a0, a1, 0); addTo(b0, b1, 0);  
        // z1 = (a0 * b0) - z0 - z2;  
        vector<int> z1 = karatsuba(a0, b0);  
        subFrom(z1, z0);  
        subFrom(z1, z2);  
        // ret = z0 + z1 * 10^half + z2 * 10^(half*2)  
        vector<int> ret;  
        addTo(ret, z0, 0);   
        addTo(ret, z1, half);  
        addTo(ret, z2, half + half);  
        return ret;  
    }
    
    int CountHug(string group, string fan){
        int groupSize=group.size();
        int fanSize=fan.size();
        vector<int> groupNo(groupSize, 0);
        vector<int> fanNo(fanSize, 0);
    
        for(int i=0; i<groupSize; i++){
            if(group[i] == 'M'){
                groupNo[i]=1;
            }
        }
        for(int i=0; i<fanSize; i++){
            if(fan[i] == 'M'){
                fanNo[fanSize-i-1]=1;
            }
        }
    
        vector<int> result=karatsuba(groupNo, fanNo);
        int allHugCount=0;
        for(int i=groupSize-1; i<fanSize; i++){
            if(result[i] == 0)
                allHugCount++;
        }
    
        return allHugCount;
    }
    
    int main(){ 
        int testCase=0;
        cin>>testCase;
    
        string group, fan;
    
        for(int i=0; i<testCase; i++){
            cin>>group>>fan;
            int result=CountHug(group, fan);
            results.push_back(result);
        }
        for(auto result : results){
            cout<<result<<endl;
        }
    }
    

    아오 열받아 ㅠㅠ

    카라츄반지 카사노반지


    9년 전
5개의 댓글이 있습니다.
  • rlatkddn212
    rlatkddn212

    normalize 할필요 없어요 책에 있는 코드 안에 적혀 있음
    그게 문제가 아니라면 모르겠네요 ㅎㅎ..


    9년 전 link
  • rlatkddn212
    rlatkddn212

    4
    FFFMMM
    MMMFFF
    1
    FFFFF
    FFFFFFFFFF
    6
    FFFFM
    FFFFFMMMMF
    2
    MFMFMFFFMMMFMF
    MMFFFFFMFFFMFFFFFFMFFFMFFFFMFMMFFFFFFF
    2

    이런 식으로 출력해야 될껄용


    9년 전 link
  • cjkis
    cjkis

    multiply 안에 normalize는 뺐어요 그리고 답 출력은 저렇게 출력하는게 예제대로 출력하는건데... 제가 다른문제 풀었을 때 답출력은 아무래도 상관없었습니다. ㅋㅋ


    9년 전 link
  • rlatkddn212
    rlatkddn212

    ㄴ 아 출력은 상관없는거군요 ㅎㅎ.. 몰랐어용 addto subFrom 함수에도 normalize이들어가 있는데 빼셨나용?


    9년 전 link
  • cjkis
    cjkis

    헐 정답나오넹!!!!!!!! ㄳㄳ
    근데 아까도 뺴고 해봤는데 왜 지금은되지 ㅋㅋㅋㅋㅋㅋㅋ으악.... ㅠㅠ


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