JMBOOK FANMEETING 문제관련 질문입니다. 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개의 댓글이 있습니다. JongMan 시간 초과의 원인은 바로 if(an < bn)karastuba(b,a); 이 줄에 있습니다. ; 답도 틀리게 나오는데, 카라츠바 알고리즘 구현하는 karastuba()함수에 잘못이 있는 것 같네요. 13년 전 link shinhj88 이런 ㅋㅋㅋ 감사합니다 그리고 한가지 더질문있는데요 STL을 쓰지 않고 오로지 C를 이용하여 짜여진 소스를 구할수 있을까요?? 13년 전 link Being 문제를 해결하신 후에 [[problem:FANMEETING]] 문제의 해결 답안 목록을 보시면 다른 분들의 소스 코드를 보실 수 있습니다. 13년 전 link shinhj88 FANMEETING 문제가아니라 karastuba알고리즘에대한 소스를 원한던것이였습니다. 제가 C로 구현하려고 하였는데 매모리를 다시잡고 그런 부분이 구현하기 어려워서 공부하기위해 요청을 하였던 것입니다. 13년 전 link JongMan 그런 소스를 구할 수 있는지는 잘 모르겠습니다. 대부분 참가자들이 C++를 쓰는 이유가 메모리를 다시 잡고 이런 부분이 구현하기 어렵기 때문입니다. ㅎㅎ 13년 전 link cosics a.resize(max(a.size(), b.size()+1)); 가 잘못된 것 같습니다. a.resize(max(a.size(), b.size())+1); 로 변경해야 할 것 같습니다. 9년 전 link 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.
shinhj88
제가 JMBOOK으로 공부를하고 있는 학생입니다.
이책에서 나온 풀이 방식대로 카라츠바 알고리즘을 이용하여 문제를 풀었는데 시간 초과가 나옵니다.
언어는 c++이고요.
소스는 아래 있고요 왜 시간초과가 나오는지 이유를 알려주시면 감사하겠습니다
~~~c++
#include mutiply(const vector& a,const vector& b)c(a.size()+b.size()+1,0);
{
{& a,vector& b, int k)
#include
#include
#include
#include
using namespace std;
vector
{
vector
for(int i=0;i
for(int j=0;j
c[i+j]+=a[i]*b[j];
}
}
return c;
}
void addto(vector
{
a.resize(max(a.size(), b.size()+k));
for(int i = 0; i < b.size(); i++)
{
a[i+k]+=b[i];
}& a,vector&b) karastuba(vector a,vector b)(); a1(a.begin(),a.begin() + half); b1(b.begin(),b.begin()+ bn); a0(a.begin() + half,a.end()); b0(b.begin() + bn , b.end()); z2 = karastuba(a1 , b1); z0 = karastuba(a0, b0); z1 = karastuba(a0,b0); ret;& a,int n,int m) a(n),b(m); c = karastuba(a,b);
void subfrom(vector
{
a.resize(max(a.size(), b.size()+1));
for(int i = 0; i < b.size(); i++)
{
a[i]-=b[i];
}
}
vector
{
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
if(bn > half)bn=half;
vector
vector
vector
vector
vector
addto(a0,a1,0);
addto(b0,b1,0);
vector
subfrom(z1,z0);
subfrom(z1,z2);
vector
addto(ret,z2,half+half);
addto(ret,z1,half);
addto(ret,z0,0);
return ret;
}
int hugs(vector
{
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
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
printf("%d\n",hugs(c,n,m));
}
int main()
{
int T;
scanf("%d\n",&T);
while(T--)
{
input();
}
return 0;
}
13년 전