- #include <iostream> 
- #include <vector> 
- #include <climits> 
- #include <cstdlib> 
- #include <ctime> 
- #include <random> 
- #include <iomanip> 
- using namespace std; 
-   
- unsigned int myConcat(unsigned int& a, unsigned int& b) { 
- 	switch( (b >= 10000000) ? 7 :  
- 			(b >= 1000000) ? 6 :  
- 			(b >= 100000) ? 5 :  
- 			(b >= 10000) ? 4 :  
- 			(b >= 1000) ? 3 :  
- 			(b >= 100) ? 2 :  
- 			(b >= 10) ? 1 : 0 ) { 
- 		case 1: return a*100+b; break; 
-     	case 2: return a*1000+b; break; 
-     	case 3: return a*10000+b; break; 
-     	case 4: return a*100000+b; break; 
-     	case 5: return a*1000000+b; break; 
-     	case 6: return a*10000000+b; break; 
-     	case 7: return a*100000000+b; break; 
-     	default: return a*10+b; break; 
-     	// I don't really know what to do here 
-     	//case 8: return a*1000*1000*1000+b; break; 
-     	//case 9: return a*10*1000*1000*1000+b; break; 
- 	} 
- } 
-   
- unsigned int uintcat (unsigned int& ms, unsigned int& ls) { 
- 	unsigned int mult; 
- 	for(mult=10; mult <= ls; mult *= 10) {} 
- 	return ms * mult + ls; 
- } 
-   
- int main() { 
- 	default_random_engine generator; 
-   	uniform_int_distribution<unsigned int> distrA(0,9),distrB(0,100*1000*1000); 
-   	int i; 
-   
-   	int testCnt = 10*1000*1000; 
-   	time_t start_time; 
- 	cout << setprecision(3) << fixed; 
-   
-   	vector<unsigned int> a(testCnt), b(testCnt); 
-   	for(i = 0; i < testCnt; i++) 
- 		a[i] = distrA(generator), b[i] = distrB(generator); 
-   
- 	start_time = clock(); 
- 	for(i = 0; i < testCnt; ++i) 
- 		myConcat(a[i], b[i]); 
- 	cout << (clock()-start_time)/double(CLOCKS_PER_SEC) << "\n"; 
-   
- 	// use separate vectors to overcome memory hashing, but data is the same 
- 	vector<unsigned int> c(a.begin(), a.end()), d(b.begin(), b.end()); 
- 	start_time = clock(); 
- 	for(i = 0; i < testCnt; ++i) 
- 		uintcat(c[i], d[i]); 
- 	cout << (clock()-start_time)/double(CLOCKS_PER_SEC) << "\n"; 
-   
- 	return 0; 
- } 
				I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y2xpbWl0cz4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjdGltZT4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPGlvbWFuaXA+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp1bnNpZ25lZCBpbnQgbXlDb25jYXQodW5zaWduZWQgaW50JiBhLCB1bnNpZ25lZCBpbnQmIGIpIHsKCXN3aXRjaCggKGIgPj0gMTAwMDAwMDApID8gNyA6IAoJCQkoYiA+PSAxMDAwMDAwKSA/IDYgOiAKCQkJKGIgPj0gMTAwMDAwKSA/IDUgOiAKCQkJKGIgPj0gMTAwMDApID8gNCA6IAoJCQkoYiA+PSAxMDAwKSA/IDMgOiAKCQkJKGIgPj0gMTAwKSA/IDIgOiAKCQkJKGIgPj0gMTApID8gMSA6IDAgKSB7CgkJY2FzZSAxOiByZXR1cm4gYSoxMDArYjsgYnJlYWs7CiAgICAJY2FzZSAyOiByZXR1cm4gYSoxMDAwK2I7IGJyZWFrOwogICAgCWNhc2UgMzogcmV0dXJuIGEqMTAwMDArYjsgYnJlYWs7CiAgICAJY2FzZSA0OiByZXR1cm4gYSoxMDAwMDArYjsgYnJlYWs7CiAgICAJY2FzZSA1OiByZXR1cm4gYSoxMDAwMDAwK2I7IGJyZWFrOwogICAgCWNhc2UgNjogcmV0dXJuIGEqMTAwMDAwMDArYjsgYnJlYWs7CiAgICAJY2FzZSA3OiByZXR1cm4gYSoxMDAwMDAwMDArYjsgYnJlYWs7CiAgICAJZGVmYXVsdDogcmV0dXJuIGEqMTArYjsgYnJlYWs7CiAgICAJLy8gSSBkb24ndCByZWFsbHkga25vdyB3aGF0IHRvIGRvIGhlcmUKICAgIAkvL2Nhc2UgODogcmV0dXJuIGEqMTAwMCoxMDAwKjEwMDArYjsgYnJlYWs7CiAgICAJLy9jYXNlIDk6IHJldHVybiBhKjEwKjEwMDAqMTAwMCoxMDAwK2I7IGJyZWFrOwoJfQp9Cgp1bnNpZ25lZCBpbnQgdWludGNhdCAodW5zaWduZWQgaW50JiBtcywgdW5zaWduZWQgaW50JiBscykgewoJdW5zaWduZWQgaW50IG11bHQ7Cglmb3IobXVsdD0xMDsgbXVsdCA8PSBsczsgbXVsdCAqPSAxMCkge30KCXJldHVybiBtcyAqIG11bHQgKyBsczsKfQoKaW50IG1haW4oKSB7CglkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuZXJhdG9yOwogIAl1bmlmb3JtX2ludF9kaXN0cmlidXRpb248dW5zaWduZWQgaW50PiBkaXN0ckEoMCw5KSxkaXN0ckIoMCwxMDAqMTAwMCoxMDAwKTsKICAJaW50IGk7CiAgCQogIAlpbnQgdGVzdENudCA9IDEwKjEwMDAqMTAwMDsKICAJdGltZV90IHN0YXJ0X3RpbWU7Cgljb3V0IDw8IHNldHByZWNpc2lvbigzKSA8PCBmaXhlZDsKICAJCiAgCXZlY3Rvcjx1bnNpZ25lZCBpbnQ+IGEodGVzdENudCksIGIodGVzdENudCk7CiAgCWZvcihpID0gMDsgaSA8IHRlc3RDbnQ7IGkrKykKCQlhW2ldID0gZGlzdHJBKGdlbmVyYXRvciksIGJbaV0gPSBkaXN0ckIoZ2VuZXJhdG9yKTsKCQoJc3RhcnRfdGltZSA9IGNsb2NrKCk7Cglmb3IoaSA9IDA7IGkgPCB0ZXN0Q250OyArK2kpCgkJbXlDb25jYXQoYVtpXSwgYltpXSk7Cgljb3V0IDw8IChjbG9jaygpLXN0YXJ0X3RpbWUpL2RvdWJsZShDTE9DS1NfUEVSX1NFQykgPDwgIlxuIjsKCQkKCS8vIHVzZSBzZXBhcmF0ZSB2ZWN0b3JzIHRvIG92ZXJjb21lIG1lbW9yeSBoYXNoaW5nLCBidXQgZGF0YSBpcyB0aGUgc2FtZQoJdmVjdG9yPHVuc2lnbmVkIGludD4gYyhhLmJlZ2luKCksIGEuZW5kKCkpLCBkKGIuYmVnaW4oKSwgYi5lbmQoKSk7CglzdGFydF90aW1lID0gY2xvY2soKTsKCWZvcihpID0gMDsgaSA8IHRlc3RDbnQ7ICsraSkKCQl1aW50Y2F0KGNbaV0sIGRbaV0pOwoJY291dCA8PCAoY2xvY2soKS1zdGFydF90aW1lKS9kb3VibGUoQ0xPQ0tTX1BFUl9TRUMpIDw8ICJcbiI7CgkKCXJldHVybiAwOwp9