JMBOOK FANMEETING 문제관련 질문입니다.

  • shinhj88
    shinhj88

    제가 JMBOOK으로 공부를하고 있는 학생입니다.

    이책에서 나온 풀이 방식대로 카라츠바 알고리즘을 이용하여 문제를 풀었는데 시간 초과가 나옵니다.

    언어는 c++이고요.
    소스는 아래 있고요 왜 시간초과가 나오는지 이유를 알려주시면 감사하겠습니다

    #include <cstdio>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <iostream>
    using namespace std;
    vector<int> mutiply(const vector<int>& a,const vector<int>& b)
    {
        vector<int>c(a.size()+b.size()+1,0);
        for(int i=0;i<a.size();i++)
        {
            for(int j=0;j<b.size();j++)
            {
                c[i+j]+=a[i]*b[j];
            }
        }
        return c;
    }
    void addto(vector<int>& a,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];
    
        }
    }
    void subfrom(vector<int>& a,vector<int>&b)
    {
        a.resize(max(a.size(), b.size()+1));
        for(int i = 0; i < b.size(); i++)
        {
            a[i]-=b[i];
        }
    }
    vector<int> karastuba(vector<int> a,vector<int> b)
    {
        int an = a.size(),bn = b.size();
        if(an < bn)karastuba(b,a);
        if(an == 0||bn == 0)return vector<int>();
        if(an <= 50) return mutiply(a,b);
        int half=an/2;
        vector<int> a1(a.begin(),a.begin() + half);
        if(bn > half)bn=half;
        vector<int> b1(b.begin(),b.begin()+ bn);
        vector<int> a0(a.begin() + half,a.end());
        vector<int> b0(b.begin() + bn , b.end());
        vector<int> z2 = karastuba(a1 , b1);
        vector<int> z0 = karastuba(a0, b0);
        addto(a0,a1,0);
        addto(b0,b1,0);
        vector<int> z1 = karastuba(a0,b0);
        subfrom(z1,z0);
        subfrom(z1,z2);
        vector<int> ret;
        addto(ret,z2,half+half);
        addto(ret,z1,half);
        addto(ret,z0,0);
        return ret;
    }
    int hugs(vector<int>& a,int n,int m)
    {
        int hug=0;
        for(int i = n-1; i < m; i++)
        {
            if(a[i]==0)hug++;
        }
        return hug;
    }
    void input()
    {
        string member,fans;
        int n,m;
        getline(cin,member);
        getline(cin,fans);
        n=member.size(),m=fans.size();
        vector<int> a(n),b(m);
        for(int i = 0; i < n;i++) a[i]=(member[i]=='M');
        for(int i = 0; i < m;i++) b[m-i-1]=(fans[i]=='M');
        vector<int> c = karastuba(a,b);
        printf("%d\n",hugs(c,n,m));
    }
    int main()
    {
        int T;
        scanf("%d\n",&T);
        while(T--)
        {
            input();
        }
        return 0;
    }
    


    11년 전
6개의 댓글이 있습니다.
  • JongMan
    JongMan

    시간 초과의 원인은 바로

    if(an < bn)karastuba(b,a);

    이 줄에 있습니다. ^^; 답도 틀리게 나오는데, 카라츠바 알고리즘 구현하는 karastuba()함수에 잘못이 있는 것 같네요.


    11년 전 link
  • shinhj88
    shinhj88

    이런 ㅋㅋㅋ 감사합니다
    그리고 한가지 더질문있는데요 STL을 쓰지 않고 오로지 C를 이용하여 짜여진 소스를 구할수 있을까요??


    11년 전 link
  • Being
    Being

    문제를 해결하신 후에 FANMEETING 문제의 해결 답안 목록을 보시면 다른 분들의 소스 코드를 보실 수 있습니다.


    11년 전 link
  • shinhj88
    shinhj88

    FANMEETING 문제가아니라 karastuba알고리즘에대한 소스를 원한던것이였습니다.
    제가 C로 구현하려고 하였는데 매모리를 다시잡고 그런 부분이 구현하기 어려워서 공부하기위해 요청을 하였던 것입니다.


    11년 전 link
  • JongMan
    JongMan

    그런 소스를 구할 수 있는지는 잘 모르겠습니다. 대부분 참가자들이 C++를 쓰는 이유가 메모리를 다시 잡고 이런 부분이 구현하기 어렵기 때문입니다. ㅎㅎ


    11년 전 link
  • cosics
    cosics

    a.resize(max(a.size(), b.size()+1)); 가 잘못된 것 같습니다.
    a.resize(max(a.size(), b.size())+1); 로 변경해야 할 것 같습니다.


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