diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ac80737cbad89f122d2fce5631a76e7b46159e80
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+*.c
+changpu_v2
+
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..c44172d5a029f9c4d694ba866e0d2734e8f1b573
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,10 @@
+
+CC ?= gcc -O3
+
+build:
+	cython --embed changpu_v2.py
+	$(CC) changpu_v2.c -o changpu_v2 $$(python3-config --cflags --ldflags --embed)
+
+clean:
+	rm -f *.c changpu changpu_v2
+
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..cc2dbaa293f3f76818ffe078ce2c419d4730c984
--- /dev/null
+++ b/README.md
@@ -0,0 +1,46 @@
+# changpu\_zhang
+
+张菖蒲。此程序遍历所有情形寻找最优解,未作优化(懒)。
+
+## performance
+
+```
+CASE Q: PYTHON=0.041s, C=0.040s
+CASE 42: PYTHON=0.041s, C=0.023s
+CASE 5Q2: PYTHON=0.038s, C=0.022s
+CASE 5A53: PYTHON=0.040s, C=0.038s
+CASE 5669: PYTHON=0.023s, C=0.023s
+CASE 54Q3: PYTHON=0.039s, C=0.021s
+CASE A877: PYTHON=0.038s, C=0.034s
+CASE KJA5: PYTHON=0.024s, C=0.021s
+CASE K325: PYTHON=0.039s, C=0.039s
+CASE Q6348: PYTHON=0.028s, C=0.023s
+CASE AK6522: PYTHON=0.023s, C=0.040s
+CASE QJ35482: PYTHON=0.041s, C=0.038s
+CASE 9583JQ3A: PYTHON=0.040s, C=0.022s
+CASE K98KK8239: PYTHON=0.040s, C=0.040s
+CASE 45232A62A4: PYTHON=0.055s, C=0.141s
+CASE A9JK95A8K98: PYTHON=0.059s, C=0.159s
+CASE 437998Q7Q637: PYTHON=0.099s, C=0.186s
+CASE 4K223JQ82Q6J5: PYTHON=0.268s, C=0.184s
+CASE J43J744392A563: PYTHON=1.063s, C=0.162s
+CASE 64322666KJK36AJ: PYTHON=2.914s, C=0.171s
+CASE 8AAQ4355A626276K: PYTHON=12.286s, C=0.178s
+CASE JQ68K2745574A5KA9: PYTHON=......., C=0.224s
+CASE 5978339223K9J73A7J: PYTHON=......., C=0.330s
+CASE 24KJ7Q7886592264278: PYTHON=......., C=0.409s
+CASE 3729J6JQ6JQ63QQ75KK2: PYTHON=......., C=0.855s
+CASE K3K2495AJ652J749J32K8: PYTHON=......., C=1.368s
+CASE Q3K6AK9JQKKJJ79A72A474: PYTHON=......., C=2.406s
+CASE 39QJJ3AK787K99655JQ85A9: PYTHON=......., C=4.878s
+CASE 432J5259A6K5588JAJJ9KQ7K: PYTHON=......., C=12.215s
+CASE A936Q4J7QKKK3J7K7AK377Q54: PYTHON=......., C=13.480s
+CASE Q328K7A284Q698649652A58936: PYTHON=......., C=22.705s
+CASE 327965J2Q62Q2K4J3247JQK5A4K: PYTHON=......., C=14.555s
+CASE 764933Q4577J9J9374KK7J9A4Q69: PYTHON=......., C=14.666s
+CASE J48J2JAK84KJ4426K4JQ5655749QK: PYTHON=......., C=15.975s
+CASE QQ8AK748K2K6824557K98Q35K554J8: PYTHON=......., C=15.039s
+```
+
+
+
diff --git a/benchmark.sh b/benchmark.sh
new file mode 100644
index 0000000000000000000000000000000000000000..cded64c2100896a67da7b3bb4de5c509e9ab7beb
--- /dev/null
+++ b/benchmark.sh
@@ -0,0 +1,61 @@
+
+
+
+
+function for_case () {
+    pytime=`( time python3 changpu_v2.py $1 ) 2>&1 | grep real | sed 's/^.*m//g'`
+    ctime=`( time ./changpu_v2 $1 ) 2>&1 | grep real | sed 's/^.*m//g'`
+    echo "CASE $1: PYTHON=$pytime, C=$ctime"
+}
+
+function for_case_c () {
+    ctime=`( time ./changpu_v2 $1 ) 2>&1 | grep real | sed 's/^.*m//g'`
+    echo "CASE $1: PYTHON=......., C=$ctime"
+}
+
+
+for_case Q
+for_case 42
+for_case 5Q2
+for_case 5A53
+for_case 5669
+for_case 54Q3
+for_case A877
+for_case KJA5
+for_case K325
+for_case Q6348
+for_case AK6522
+for_case QJ35482
+for_case 9583JQ3A
+for_case K98KK8239
+for_case 45232A62A4
+for_case A9JK95A8K98
+for_case 437998Q7Q637
+for_case 4K223JQ82Q6J5
+for_case J43J744392A563
+for_case 64322666KJK36AJ
+for_case 8AAQ4355A626276K
+for_case_c JQ68K2745574A5KA9
+for_case_c 5978339223K9J73A7J
+for_case_c 24KJ7Q7886592264278
+for_case_c 3729J6JQ6JQ63QQ75KK2
+for_case_c K3K2495AJ652J749J32K8
+for_case_c Q3K6AK9JQKKJJ79A72A474
+for_case_c 39QJJ3AK787K99655JQ85A9
+for_case_c 432J5259A6K5588JAJJ9KQ7K
+for_case_c A936Q4J7QKKK3J7K7AK377Q54
+for_case_c Q328K7A284Q698649652A58936
+for_case_c 327965J2Q62Q2K4J3247JQK5A4K
+for_case_c 764933Q4577J9J9374KK7J9A4Q69
+for_case_c J48J2JAK84KJ4426K4JQ5655749QK
+for_case_c QQ8AK748K2K6824557K98Q35K554J8
+
+
+
+# for len in (seq 20)
+#     for i in (seq $len)
+#         echo -n (random choice A 2 3 4 5 6 7 8 9 J Q K)
+#     end
+#     echo ''
+# end
+
diff --git a/changpu.py b/changpu.py
deleted file mode 100644
index c1980b2f4992f19c1a01f277cb76125dfc130937..0000000000000000000000000000000000000000
--- a/changpu.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#cython: language_level=3
-
-s = 'A8492QJ835433'
-s = input("INPUT: ")
-
-import itertools
-
-def basic_char_to_int(ch):
-    ls = '0A23456789JQK'
-    return ls.find(ch)
-def basic_int_to_char(i):
-    ls = '0A23456789JQK'
-    return ls[i]
-
-def comb_exclude_border(ar):
-    results = []
-    for i in range(len(ar)):
-        if i != 0:
-            results += list(itertools.combinations(ar, i))
-    return results
-def sorted_list_dedup(ls):
-    if len(ls) == 0:
-        return ls
-    prev = "Impossible to match"
-    res = []
-    for elem in ls:
-        if elem != prev:
-            prev = elem
-            res.append(elem)
-    return res
-def set_try_sum_to_number(ls, target_int):
-    ls = ls.sort()
-    return "TODO" # TODO: speed up
-
-# we devide array to two half: halfA+halfB. 
-# Then find halfA == one of halfB.subset()
-def combinations_pair_gen(ar):
-    combinations = comb_exclude_border(range(len(ar)))
-    results = []
-    for combination in combinations:
-        halfA, halfB = [], []
-        for i in range(len(ar)):
-            (halfA if i in combination else halfB).append(ar[i])
-        results.append((halfA, halfB))
-    return results
-
-
-ar = [basic_char_to_int(ch) for ch in s]
-possibilities = combinations_pair_gen(ar)
-answers = []
-for possib in possibilities:
-    halfA, halfB = possib
-    if sum(halfA) > sum(halfB):
-        continue
-    elif sum(halfA) == sum(halfB):
-        answers.append((halfA, halfB))
-    else:
-        # let's split halfB
-        for possib_halfB in comb_exclude_border(halfB):
-            if sum(halfA) == sum(possib_halfB):
-                answers.append((halfA, possib_halfB))
-
-# now filter answers
-quant = [len(answer[0]) + len(answer[1]) for answer in answers]
-answers.sort(reverse=True, key=lambda answer: len(answer[0]) + len(answer[1]))
-answers = sorted_list_dedup(answers)
-answers = answers[:5] if len(answers) > 5 else answers
-
-# print answers
-for answer in answers:
-    halfA_s = ''.join([basic_int_to_char(i) for i in answer[0]])
-    halfB_s = ''.join([basic_int_to_char(i) for i in answer[1]])
-    print(halfA_s, "===", halfB_s)
-    
-
diff --git a/changpu_v2.py b/changpu_v2.py
index 9ab6d236f2e6dd529e113d6f4437c22b82f8ee30..fe156bf194a3a6f374880c9dc536a9a9db392271 100644
--- a/changpu_v2.py
+++ b/changpu_v2.py
@@ -1,5 +1,10 @@
-s = 'A8492QJ835433'
-s = input("INPUT: ")
+#cython: language_level=3
+
+import sys
+if len(sys.argv) == 2:
+    s = sys.argv[1]
+else:
+    s = input("INPUT: ")
 
 import itertools
 
@@ -40,7 +45,7 @@ combinations = comb_exclude_border(range(len(ar)))
 # 100 -> [[0,1,2,3], [6,7,8]]
 sum_buf = {}
 for comb in combinations:
-    sum_val = sum(comb)
+    sum_val = sum([ar[index] for index in comb])
     if sum_val in sum_buf:
         sum_buf[sum_val].append(arr_to_bitarray(comb))
     else: