2014-03-28 2 views
0

spoj onezero 어떻게 문자열을 avoide? SPOJ 문제에

http://www.spoj.com/problems/ONEZERO/

onezero 나는 BFS을하려합니다. 각 주마다 나는 각 단계에서 나머지를 사용하고 있습니다. 의견 및 많은 포럼을 읽은 후 문자열을 여기에서 사용할 수 없다는 것을 이해했습니다. 어떻게 여기에 내 코드를 수정 :

#include<cstdio> 
#include<cstring> 
#include<cmath> 
#include<cstdlib> 
#include<cstdio> 
#include<ctime> 
#include<cctype> 
#include<cassert> 
#include<climits> 
#include<cerrno> 
#include<cfloat> 
#include<ciso646> 
#include<clocale> 
#include<csetjmp> 
#include<csignal> 
#include<cstdarg> 
#include<cstddef> 
#include<cstdio> 
#include<cstdlib> 
#include<cstring> 
#include<ctime> 
#include<cwchar> 
#include<cwctype> 

//containers 
#include<vector> 
#include<list> 
#include<map> 
#include<queue> 
#include<deque> 
#include<set> 
#include<complex> 
#include<string> 
#include<stack> 
#include<bitset> 
#include<istream> 
#include<valarray> 

//IOs 
#include<iostream> 
#include<sstream> 
#include<iomanip> 
#include<fstream> 
#include<exception> 
#include<ios> 
#include<iosfwd> 
#include<ostream> 
#include<iterator> 
#include<stdexcept> 
#include<streambuf> 


//algorithm & miscellaneous 
#include<algorithm> 
#include<functional> 
#include<numeric> 
#include<utility> 
#include<limits> 
#include<locale> 
#include<memory> 
#include<new> 

// My Terms 
#define pb push_back 
#define mp make_pair 
#define ins insert 
#define fir first 
#define sec second 
#define PRINT(x)  cout << #x << " " << x << endl 
#define pi acos(-1) 
#define ll long long 
#define EM empty() 
#define sz(a) int((a).size()) 
#define all(c) (c).begin(),(c).end() 
#define fill(a,v)  memset(a, v, sizeof(a)) 


//http://lab.polygonal.de/?p=81 

using namespace std; 

int exist[20010]; 

int main() 
{ 
    int test; 
    cin>>test; 
    while(test--) 
    { 
     memset(exist,0,sizeof(int)*20010); 
     int t; 
     cin>>t; 

     if(t==1) 
     { 
      cout<<"1\n"; 
      break; 
     } 


     int rem=0; 
     string num; 

     queue < pair<string,int> > q; // one for number and one for remainder 
     q.push(mp("1",1)); 


     while(q.size()) 
     { 
      num=q.front().first; 
      rem=q.front().second; 
      exist[rem]=1; 

      q.pop(); 


      if(rem == 0) 
      { 
       cout<<num<<"\n"; 
       break; 
      } 


      if(exist[((rem*10 +1)%t)]==0 && ((rem*10 +1)%t)<20000) 
      { 
       q.push(mp(num+'1',((rem*10 +1)%t) )) ; 
       exist[((rem*10 +1)%t)]=1; 
      } 

      if(exist[((rem*10 +0)%t)]==0 && ((rem*10 +0)%t)<20000 ) 
      { 
       q.push(mp(num+'0', (rem*10 +0)%t)); 
       exist[ ((rem*10 +0)%t) ]=1; 
      } 

     } 





    } 




} 

이 어떻게 나에게 그렇게 할 수있는 방법을 설명 좀 해줘 문자열을 피할 수 있습니다.

답변

-1

num + '0'및 num + '1'을 푸는 대신; 문자열의 십진수 인 정수를 전달하면됩니다. 예 : q.push (mp ('1001', (rem * 10) % t)) 대신 q.push (mp (9, (rem * 10) % t))를 사용할 수 있습니다. 이렇게하면 속도를 조금 더 높일 수 있습니다.

하지만 여전히 TLE을 제공합니다. 이를 극복하기 위해서는 과거에 어떤 잔해가 있었는지 기억하는 '방문한'배열이 있어야하며 대기열에서 다시 누를 필요가 없습니다.

'방문한'배열을 사용하면 AC