CodeChef submission 789013 (C++ 4.3.2) plaintext list. Status: TLE, problem LUCKY3, contest JAN12. By jfogh (jfogh), 2012-01-11 14:38:19.
#include <set> #include <cstdio> #include <vector> #include <string> #include <cstring> #include <cstdlib> #include <sstream> #include <algorithm> #include <map> #include <cmath> #include <iostream> #include <iomanip> #include <queue> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define PB push_back #define MP make_pair #define FOR(i,from,to) for (int i = from; i < to; i++) #define FORit(c,it) for (typeof(c.begin()) it=c.begin(); c.end()!=it;++it) #define SZ(v) v.size() #define LEN(s) s.length() #define X first #define Y second #define INIT(m,v) memset(m,v,sizeof(m)) #define ALL(c) c.begin(), c.end() #define V vector static ll dp[1<<19]; static int convert(int d) { int res = 0, digits = 0; for (int ii = 0; d; ++ii) { int rem = d % 10; d /= 10; int digit; if (4 > rem) digit = 0; else if (4 == rem) digit = 1; else if (7 > rem) digit = 2; else if (7 == rem) digit = 3; else return -1; res |= digit << ii * 2 + 3; digits = ii + 1; } res |= digits - 1; return res; } static inline int combine(int a, int b) { int res=max((a & 0x7), (b & 0x7)); int digits=res + 1; FOR(ii,0,digits) res |= max((b >> ii * 2 + 3) & 0x3, (a >> ii * 2 + 3) & 0x3) << ii * 2 + 3; return res; } int main (int argc, char **argv) { int T; FOR(tt,0,T) { int n; FOR(kk,0,1<<19) dp[kk]=0; dp[0]=1; FOR(ii,0,n) { int d; d = convert(d); if (-1 != d) { FOR(kk,0,1<<19) { int jj = (1<<19)-1-kk; int a = combine(d,jj); dp[a]+=dp[jj]; } } } ll res=0; FOR(digits,0,8) { FOR(ii,0,1<<digits+1) { int index = digits; FOR(jj,0,digits+1) { index |= ((ii>>jj) & 0x1) << jj * 2 + 4; index |= 1 << jj * 2 + 3; } res+=dp[index]; } } } return 0; }
Comments

