ADDED SRM/589-U/1A.cpp Index: SRM/589-U/1A.cpp ================================================================== --- SRM/589-U/1A.cpp +++ SRM/589-U/1A.cpp @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +struct UnionFind +{ + vector uf, sz; + int nc; + + UnionFind(int N): uf(N), sz(N,1), nc(N) + { for(int i=0; i= sz[b] ) swap(a, b); + uf[a] = b; + sz[b] += sz[a]; + --nc; + } + return (a!=b); + } +}; + +class GooseTattarrattatDiv1 { public: + int getmin(string S) + { + UnionFind uf(128); + + map time_for; + for(int i=0; i done; + for(auto c : S) + { + if(done.count(c)) + continue; + + int need = 0; + int m = 0; + for(auto d : S) + if(uf.Find(c) == uf.Find(d)) { + if(done.count(d)) + continue; + done.insert(d); + need += time_for[d]; + m = max(m, time_for[d]); + } + total += (need - m); + } + + return total; + } +}; + +// BEGIN CUT HERE +#include +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(_, GooseTattarrattatDiv1().getmin(S));} +int main(){ + +CASE(0) + string S = "geese"; + int _ = 2; +END +CASE(1) + string S = "tattarrattat"; + int _ = 0; +END +CASE(2) + string S = "xyyzzzxxx"; + int _ = 2; +END +CASE(3) + string S = "xrepayuyubctwtykrauccnquqfuqvccuaakylwlcjuyhyammag"; + int _ = 11; +END +CASE(4) + string S = "abaabb"; + int _ = 3; +END +/* +CASE(5) + string S = ; + int _ = ; +END +CASE(6) + string S = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/589-U/1B.cpp Index: SRM/589-U/1B.cpp ================================================================== --- SRM/589-U/1B.cpp +++ SRM/589-U/1B.cpp @@ -0,0 +1,167 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +typedef int vert; +typedef vert edge; +typedef vector edges; +typedef vector graph; + +bool augment( graph& G, int v, vector& matchTo, bool visited[] ) +{ + for(int i=0; i +int biMatch( graph& G, int L ) // [0,L):left, [L,?):right + // only left->right edges are used during computation +{ + vector matchTo(G.size(), -1); + int ans = 0; + for(vert v=0; v graph) + { + vector r, g, b; + for(int i=0; i& G, const vector& A, const vector& B) + { + if(A.empty() || B.empty()) + return 0; + + graph gr(A.size() + B.size()); + for(int a=0; a(gr, A.size()); + } +}; + +// BEGIN CUT HERE +#include +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(_, GearsDiv1().getmin(color, graph));} +int main(){ + +CASE(0) + string color = "RGB"; + string graph_[] = {"NYY","YNY","YYN"}; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = 1; +END +CASE(1) + string color = "RGBR"; + string graph_[] = {"NNNN","NNNN","NNNN","NNNN"}; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = 0; +END +CASE(2) + string color = "RGBR"; + string graph_[] = {"NYNN","YNYN","NYNY","NNYN"}; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = 1; +END +CASE(3) + string color = "RRRRRGRRBGRRGBBGGGBRRRGBRGRRGG"; + string graph_[] = {"NNNNNYNNNYNNYNNNYNNNNNNNNYNNYY", + "NNNNNNNNYNNNYNYNNYNNNNYNNYNNYY", + "NNNNNYNNNNNNNNNNNNYNNNNNNYNNNY", + "NNNNNNNNNYNNYNNYYYNNNNYNNYNNNN", + "NNNNNNNNNYNNYNNYYYNNNNYNNNNNNN", + "YNYNNNYYYNNYNYYNNNNNYYNYNNYYNN", + "NNNNNYNNNNNNNNNYYYNNNNYNNYNNYY", + "NNNNNYNNNNNNNNNYNNNNNNNNNNNNYN", + "NYNNNYNNNYNNYNNYYYNNNNYNNYNNYY", + "YNNYYNNNYNNNNYYNNNYNYYNYNNNNNN", + "NNNNNNNNNNNNYNNYNYNNNNYNNNNNNY", + "NNNNNYNNNNNNYNNYYYNNNNNNNNNNYN", + "YYNYYNNNYNYYNYYNNNYNYNNYNNNNNN", + "NNNNNYNNNYNNYNNYYYNNNNYNNYNYYY", + "NYNNNYNNNYNNYNNYYYNNNNYNNYNNYY", + "NNNYYNYYYNYYNYYNNNYNYNNYYNYYNN", + "YNNYYNYNYNNYNYYNNNYNNNNYYNNYNN", + "NYNYYNYNYNYYNYYNNNNYYNNYYNYNNN", + "NNYNNNNNNYNNYNNYYNNNNNYNNYNNNY", + "NNNNNNNNNNNNNNNNNYNNNNYNNYNNNY", + "NNNNNYNNNYNNYNNYNYNNNNYNNNNNYY", + "NNNNNYNNNYNNNNNNNNNNNNYNNNNNNN", + "NYNYYNYNYNYNNYYNNNYYYYNYYNYNNN", + "NNNNNYNNNYNNYNNYYYNNNNYNNNNNNY", + "NNNNNNNNNNNNNNNYYYNNNNYNNYNNYY", + "YYYYNNYNYNNNNYYNNNYYNNNNYNYYNN", + "NNNNNYNNNNNNNNNYNYNNNNYNNYNNYN", + "NNNNNYNNNNNNNYNYYNNNNNNNNYNNYY", + "YYNNNNYYYNNYNYYNNNNNYNNNYNYYNN", + "YYYNNNYNYNYNNYYNNNYYYNNYYNNYNN"}; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = 3; +END +/* +CASE(4) + string color = ; + string graph_[] = ; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = ; +END +CASE(5) + string color = ; + string graph_[] = ; + vector graph(graph_, graph_+sizeof(graph_)/sizeof(*graph_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/589-U/1C-U.cpp Index: SRM/589-U/1C-U.cpp ================================================================== --- SRM/589-U/1C-U.cpp +++ SRM/589-U/1C-U.cpp @@ -0,0 +1,162 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +class FlippingBitsDiv1 { public: + int getmin(vector Sv, int M) + { + string S = accumulate(Sv.begin(), Sv.end(), string()); + vector< vector > Z(M); + for(int i=0; i target(M); + for(int i=0; i flip_idx; + for(int i=0; i>& Z, const vector& T, int M) + { + const int X = Z.front().size(); + vector nc(X+1), fc(X+1); + for(int y=0; y ncy(X+1); + vector fcy(X+1); + for(int x=0; x=Z[y].size() ? 0 : (Z[y][x]==T[y] ? 0 : 1)); + fcy[x+1] = fcy[x] + (x>=Z[y].size() ? 0 : (Z[y][x]==T[y] ? 1 : 0)); + nc[x+1] += ncy[x+1]; + fc[x+1] += fcy[x+1]; + } + } + + int INF = 999999; + vector> dp(X+1, vector(2)); + enum {N, F}; + dp[X][N] = INF; + dp[X][F] = -1; + for(int x=X-1; x>=0; --x) + { + dp[x][N] = INF; + dp[x][F] = INF; + for(int q=x+1; q<=X; ++q) { + dp[x][N] = min(dp[x][N], 1+dp[q][F]+(nc[q]-nc[x])); + dp[x][F] = min(dp[x][F], 1+dp[q][N]+(fc[q]-fc[x])); + } + } + return min(dp[0][N], dp[0][F]); + } + + int solve2(const vector>& Z, const vector& flip_idx, int M) + { + return -178116; + } +}; + +// BEGIN CUT HERE +#include +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(_, FlippingBitsDiv1().getmin(S, M));} +int main(){ + +CASE(0) + string S_[] = {"00111000"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 1; + int _ = 2; +END +CASE(1) + string S_[] = {"101100001101"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 3; + int _ = 2; +END +CASE(2) + string S_[] = {"11111111"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 4; + int _ = 0; +END +CASE(3) + string S_[] = {"1101001000"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 8; + int _ = 1; +END +CASE(4) + string S_[] = {"1","10","11","100","101","110"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 5; + int _ = 4; +END +CASE(5) + string S_[] = {"1001011000101010001111111110111011011100110001001"}; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = 2; + int _ = 16; +END + /* +CASE(6) + string S_[] = ; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = ; + int _ = ; +END +CASE(7) + string S_[] = ; + vector S(S_, S_+sizeof(S_)/sizeof(*S_)); + int M = ; + int _ = ; +END + */ +} +// END CUT HERE