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

  • User Avatar
    shinhj88

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

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

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

    ~~~c++

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

    
    </spoiler>
    

    13년 전
6개의 댓글이 있습니다.
  • User Avatar
    JongMan

    시간 초과의 원인은 바로


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

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


    13년 전 link
  • User Avatar
    shinhj88

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


    13년 전 link
  • User Avatar
    Being

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


    13년 전 link
  • User Avatar
    shinhj88

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


    13년 전 link
  • User Avatar
    JongMan

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


    13년 전 link
  • User Avatar
    cosics

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


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