ADDED SRM/579-U/1A.cpp Index: SRM/579-U/1A.cpp ================================================================== --- SRM/579-U/1A.cpp +++ SRM/579-U/1A.cpp @@ -0,0 +1,109 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +class UndoHistory { public: + int minPresses(vector lines) + { + int score = lines[0].size() + 1; + for(int i=1; i(best, 2 + lines[i].size()-pm); + } else { + if(pm == lines[k].size()) + best = min(best, lines[i].size() - pm); + else + best = min(best, 2 + lines[i].size() - pm); + } + } + score += best+1; + } + return score; + } + + int prefix_match(const string& a, const string& b) + { + int i = 0; + while(i +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, UndoHistory().minPresses(lines));} +int main(){ + +CASE(0) + string lines_[] = {"tomorrow", "topcoder"}; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = 18; +END +CASE(1) + string lines_[] = {"a","b"}; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = 6; +END +CASE(2) + string lines_[] = {"a", "ab", "abac", "abacus" }; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = 10; +END +CASE(3) + string lines_[] = {"pyramid", "sphinx", "sphere", "python", "serpent"}; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = 39; +END +CASE(4) + string lines_[] = {"ba","a","a","b","ba"} +; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = 13; +END +/* +CASE(5) + string lines_[] = ; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = ; +END +CASE(6) + string lines_[] = ; + vector lines(lines_, lines_+sizeof(lines_)/sizeof(*lines_)); + int _ = ; +END + */ +} +// END CUT HERE ADDED SRM/579-U/1B.cpp Index: SRM/579-U/1B.cpp ================================================================== --- SRM/579-U/1B.cpp +++ SRM/579-U/1B.cpp @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +int bitcnt(int x) +{ + int c = 0; + for(; x; x>>=1) + c += x&1; + return c; +} + +class TravellingPurchasingMan { public: + static const int INF = 0x3fffffff; + struct Store { + int open; + int close; + int shopping; + }; + + int maxStores(int N, vector interestingStores, vector roads) + { + vector< vector > d(N, vector(N, INF)); + for(int i=0; i> a >> b >> len; + d[a][b] = d[b][a] = len; + } + for(int k=0; k s; + for(int i=0; i> op >> cl >> du; + Store st = {op,cl+1,du}; // [,) + s.push_back(st); + } + + vector< pair > pop_mask; + for(int mask=0; mask<(1< > tbl(M, vector(1< +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, TravellingPurchasingMan().maxStores(N, interestingStores, roads));} +int main(){ + +CASE(0) + int N = 3; + string interestingStores_[] = {"1 10 10" , "1 55 31", "10 50 100" }; + vector interestingStores(interestingStores_, interestingStores_+sizeof(interestingStores_)/sizeof(*interestingStores_)); + string roads_[] = {"1 2 10"}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + int _ = 1; +END +CASE(1) + int N = 3; + string interestingStores_[] = {"1 10 10" , "1 55 30", "10 50 100" }; + vector interestingStores(interestingStores_, interestingStores_+sizeof(interestingStores_)/sizeof(*interestingStores_)); + string roads_[] = {"1 2 10"}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + int _ = 2; +END +CASE(2) + int N = 5; + string interestingStores_[] = {"0 1000 17"}; + vector interestingStores(interestingStores_, interestingStores_+sizeof(interestingStores_)/sizeof(*interestingStores_)); + string roads_[] = {"2 3 400", "4 1 500", "4 3 300", "1 0 700", "0 2 400"}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + int _ = 0; +END +CASE(3) +// if no wf is done. + int N = 3; + string interestingStores_[] = {"0 100 1"}; + vector interestingStores(interestingStores_, interestingStores_+sizeof(interestingStores_)/sizeof(*interestingStores_)); + string roads_[] = {"0 1 10", "1 2 10"}; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + int _ = 1; +END +/* +CASE(4) + int N = ; + string interestingStores_[] = ; + vector interestingStores(interestingStores_, interestingStores_+sizeof(interestingStores_)/sizeof(*interestingStores_)); + string roads_[] = ; + vector roads(roads_, roads_+sizeof(roads_)/sizeof(*roads_)); + int _ = ; +END +*/ +} +// END CUT HERE