├── heap.h
├── BST.in
├── 1.7.in
├── 8.2.in
├── 20.12.in
├── 9.7.in
├── BST
├── 8.6.in
├── 9.6.in
├── 13.1.in
├── 4.2.in
├── 20.11.in
├── README.md
├── 19.10.cpp
├── 7.1.cpp
├── 9.2.cpp
├── 19.4.cpp
├── 19.3.cpp
├── 1.8.cpp
├── 13.6.cpp
├── 5.5.cpp
├── 9.1.cpp
├── 1.2.cpp
├── 20.2.cpp
├── 20.3.cpp
├── 8.5.cpp
├── 19.11.cpp
├── 9.6.cpp
├── 20.1.cpp
├── 9.5.cpp
├── 16.10.cpp
├── 5.6.cpp
├── 13.1.cpp
├── 19.7.cpp
├── 8.8.cpp
├── 9.3.cpp
├── 1.6.cpp
├── 5.2.cpp
├── 20.5.cpp
├── 12.4.cpp
├── 5.1.cpp
├── 1.4.cpp
├── 3.6.cpp
├── 4.2.cpp
├── 12.3.cpp
├── 3.4.cpp
├── 10.7.cpp
├── 4.3.cpp
├── 1.7.cpp
├── 8.4.cpp
├── 9.7.cpp
├── 1.1.cpp
├── 20.12.cpp
├── 5.7.cpp
├── 2.3.cpp
├── 10.4.cpp
├── 2.2.cpp
├── 12.3.1.cpp
├── 20.8.cpp
├── 20.7.cpp
├── hash.h
├── 4.5.cpp
├── 8.6.cpp
├── 8.1.cpp
├── 8.7.cpp
├── 13.9.cpp
├── 2.5.cpp
├── 1.5.cpp
├── 8.3.cpp
├── 4.7.cpp
├── 19.5.cpp
├── 20.11.cpp
├── 2.1.cpp
├── 7.1.h
├── 20.4.cpp
├── 8.2.cpp
├── 19.2.cpp
├── 2.4.cpp
├── 4.4.cpp
├── 4.1.cpp
├── 5.3.cpp
├── 10.6.1.cpp
├── 4.8.cpp
├── 20.9.cpp
├── 10.6.cpp
├── 3.1.cpp
├── 4.6.cpp
├── 3.2.cpp
├── ac_automation.cpp
├── 1.3.cpp
├── 3.3.cpp
├── 3.5.cpp
└── BST.cpp
/heap.h:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/BST.in:
--------------------------------------------------------------------------------
1 | 2 4 3 1 9 0 7 6 8 5
2 |
--------------------------------------------------------------------------------
/1.7.in:
--------------------------------------------------------------------------------
1 | 3 4
2 | 1 2 3 4
3 | 5 0 7 8
4 | 9 10 11 0
5 |
--------------------------------------------------------------------------------
/8.2.in:
--------------------------------------------------------------------------------
1 | 3 4
2 | 1 1 1 0
3 | 0 1 1 1
4 | 1 1 1 1
5 |
--------------------------------------------------------------------------------
/20.12.in:
--------------------------------------------------------------------------------
1 | 4
2 | -1 0 -2 1
3 | -4 9 3 2
4 | -1 2 3 -1
5 | 0 11 -2 3
6 |
--------------------------------------------------------------------------------
/9.7.in:
--------------------------------------------------------------------------------
1 | 6
2 | 65 100
3 | 70 150
4 | 56 90
5 | 75 190
6 | 56 95
7 | 68 110
8 |
--------------------------------------------------------------------------------
/BST:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Hawstein/cracking-the-coding-interview/HEAD/BST
--------------------------------------------------------------------------------
/8.6.in:
--------------------------------------------------------------------------------
1 | 5 5
2 | 0 3 3 2 1
3 | 3 0 1 3 3
4 | 3 3 0 2 3
5 | 0 3 3 3 1
6 | 0 1 0 2 1
7 |
--------------------------------------------------------------------------------
/9.6.in:
--------------------------------------------------------------------------------
1 | 5 5
2 | 1 2 3 4 5
3 | 3 7 8 9 11
4 | 5 9 10 17 18
5 | 7 12 15 19 23
6 | 9 13 16 20 25
7 |
--------------------------------------------------------------------------------
/13.1.in:
--------------------------------------------------------------------------------
1 | one
2 | two
3 | three 3
4 | last 4 lines:begin
5 | the second line
6 | continue
7 | end
8 |
--------------------------------------------------------------------------------
/4.2.in:
--------------------------------------------------------------------------------
1 | 8 11
2 | 0 1
3 | 1 0
4 | 1 5
5 | 2 3
6 | 2 4
7 | 4 7
8 | 5 2
9 | 5 7
10 | 6 2
11 | 6 4
12 | 7 4
13 |
--------------------------------------------------------------------------------
/20.11.in:
--------------------------------------------------------------------------------
1 | 8
2 | 1 1 1 1 0 1 0 1
3 | 1 0 0 0 0 0 1 1
4 | 1 0 1 1 1 0 1 1
5 | 1 0 0 1 0 0 1 1
6 | 1 0 1 1 1 0 1 0
7 | 1 0 0 0 0 0 0 0
8 | 1 1 1 0 1 0 1 0
9 | 0 1 1 0 0 1 1 1
10 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | Solutions for the book: Cracking the coding interview V4. Written in C++.
2 |
3 | See the detailed solutions:
4 |
5 |
6 |
--------------------------------------------------------------------------------
/19.10.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | using namespace std;
3 |
4 | int Rand5(){
5 | int x = ~(1<<31); // max int
6 | while(x > 5)
7 | x = Rand7();
8 | return x;
9 | }
10 |
11 |
12 |
13 | int main(){
14 | return 0;
15 | }
16 |
--------------------------------------------------------------------------------
/7.1.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include "7.1.h"
3 | using namespace std;
4 |
5 | int main(){
6 | Deck deck;
7 | deck.shuffle();
8 | vector vc = deck.deal_hand(5);
9 | cout<
2 | #include
3 | using namespace std;
4 |
5 | bool cmp(string s1, string s2){
6 | sort(&s1[0], &s1[0]+s1.length());
7 | sort(&s2[0], &s2[0]+s2.length());
8 | return s1 < s2;
9 | }
10 | int main(){
11 | string s[] = {
12 | "axyz", "abc", "yzax", "bac", "zyxa", "fg", "gf"
13 | };
14 | sort(s, s+7, cmp);
15 | for(int i=0; i<7; ++i)
16 | cout<
2 | using namespace std;
3 |
4 | int Max1(int a, int b){
5 | int c[2] = {
6 | a, b
7 | };
8 | int z = a - b;
9 | z = (z>>31) & 1;
10 | return c[z];
11 | }
12 | int Max2(int a, int b){
13 | int z = a - b;
14 | int k = (z>>31) & 1;
15 | return a - k * z;
16 | }
17 | int main(){
18 | int a = 5, b = 10;
19 | cout<
2 | using namespace std;
3 |
4 | int NumZeros(int n){
5 | if(n < 0) return -1;
6 | int num = 0;
7 | while((n /= 5) > 0){
8 | num += n;
9 | }
10 | return num;
11 | }
12 | int NumZeros1(int n){
13 | if(n < 0) return -1;
14 | int num = 0;
15 | for(int i = 5; n/i > 0; i *= 5)
16 | num += n/i;
17 | return num;
18 | }
19 | int main(){
20 | for(int i=1; i<100; ++i){
21 | if(NumZeros(i) == NumZeros1(i))
22 | cout<
2 | #include
3 | using namespace std;
4 |
5 | bool isSubstring(string s1, string s2){
6 | if(s1.find(s2) != string::npos) return true;
7 | else return false;
8 | }
9 | bool isRotation(string s1, string s2){
10 | if(s1.length() != s2.length() || s1.length()<=0)
11 | return false;
12 | return isSubstring(s1+s1, s2);
13 | }
14 |
15 | int main(){
16 | string s1 = "apple";
17 | string s2 = "pleap";
18 | cout<
2 | using namespace std;
3 |
4 | class FirstClass {
5 | public:
6 | virtual void MethodA(int) {
7 | cout<<"FirstClass::MethodA(int)"<
2 | using namespace std;
3 | int count_one(int x){
4 | x = (x & (0x55555555)) + ((x >> 1) & (0x55555555));
5 | x = (x & (0x33333333)) + ((x >> 2) & (0x33333333));
6 | x = (x & (0x0f0f0f0f)) + ((x >> 4) & (0x0f0f0f0f));
7 | x = (x & (0x00ff00ff)) + ((x >> 8) & (0x00ff00ff));
8 | x = (x & (0x0000ffff)) + ((x >> 16) & (0x0000ffff));
9 | return x;
10 | }
11 |
12 | int convert_num(int a, int b){
13 | return count_one(a^b);
14 | }
15 | int main(){
16 | int a = 7, b = 14;
17 | cout<
2 | using namespace std;
3 |
4 | void merge(int a[], int b[], int n, int m){
5 | int k = n + m - 1;
6 | int i = n - 1, j = m - 1;
7 | while(i>=0 && j>=0){
8 | if(a[i] > b[j]) a[k--] = a[i--];
9 | else a[k--] = b[j--];
10 | }
11 | while(j>=0) a[k--] = b[j--];
12 | }
13 |
14 | int main(){
15 | int a[15] = {
16 | 1, 3, 7, 8, 9
17 | };
18 | int b[] = {
19 | 2, 4, 5, 6, 10
20 | };
21 | int n = 5, m = 5;
22 | merge(a, b, 5, 5);
23 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | void swap(char &a, char &b){
6 | a = a^b;
7 | b = a^b;
8 | a = a^b;
9 | }
10 |
11 | void reverse2(char *s){
12 | int n = strlen(s);
13 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | void Swap(int &a, int &b){// 有可能swap同一变量,不能用异或版本
6 | int t = a;
7 | a = b;
8 | b = t;
9 | }
10 | void RandomShuffle(int a[], int n){
11 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | void Swap(int &a, int &b){// 有可能swap同一变量,不能用异或版本
6 | int t = a;
7 | a = b;
8 | b = t;
9 | }
10 | void PickMRandomly(int a[], int n, int m){
11 | for(int i=0; i
2 | using namespace std;
3 |
4 | void print_pare(int l, int r, char str[], int cnt){
5 | if(l<0 || r 0){
14 | str[cnt] = '(';
15 | print_pare(l-1, r, str, cnt+1);
16 | }
17 | if(r > l){
18 | str[cnt] = ')';
19 | print_pare(l, r-1, str, cnt+1);
20 | }
21 | }
22 | }
23 | int main(){
24 | int cnt = 3;
25 | char str[2*cnt];
26 | print_pare(cnt, cnt, str, 0);
27 | return 0;
28 | }
29 |
--------------------------------------------------------------------------------
/19.11.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | using namespace std;
4 |
5 | void PrintPairSum(int a[], int n, int sum){
6 | if(a==NULL || n<2) return;
7 |
8 | sort(a, a+n);
9 | int low = 0, high = n-1;
10 | while(low < high){
11 | if(a[low]+a[high] > sum)
12 | --high;
13 | else if(a[low]+a[high] < sum)
14 | ++low;
15 | else{
16 | cout<
2 | #include
3 | using namespace std;
4 |
5 | int d[20][20];
6 | int search(int m, int n, int x){
7 | int r = 0, c = n-1;
8 | while(r=0){
9 | if(d[r][c] == x) return (r * n + c);
10 | else if(d[r][c] < x) ++r;
11 | else --c;
12 | }
13 | return -1;
14 | }
15 | int main(){
16 | freopen("9.6.in", "r", stdin);
17 | int m, n;
18 | cin>>m>>n;
19 | for(int i=0; i>d[i][j];
22 |
23 | int k = search(m, n, 13);
24 | if(k == -1) cout<<"not found"<
2 | using namespace std;
3 |
4 | int Add1(int a, int b){
5 | char *c = (char*)a;
6 | return (int)&c[b]; // c+sizeof(char)*b=a + b
7 | }
8 | int Add2(int a, int b){
9 | if(b == 0) return a;
10 | int sum = a ^ b; // 各位相加,不计进位
11 | int carry = (a & b) << 1; // 记下进位
12 | return Add2(sum, carry); // 求sum和carry的和
13 | }
14 | int Add3(int a, int b){
15 | while(b != 0){
16 | int sum = a ^ b;
17 | int carry = (a & b) << 1;
18 | a = sum;
19 | b = carry;
20 | }
21 | return a;
22 | }
23 | int main(){
24 | int a = 70, b = -134310;
25 | cout<
2 | using namespace std;
3 |
4 | int search(string s[], int low, int high, string x){
5 | if(x == "") return -1;
6 | while(low <= high){
7 | int mid = (low+high)>>1;
8 | int t = mid;
9 | while(s[t] == "" && t <= high) ++t;
10 | if(t > high) high = mid - 1;
11 | else{
12 | if(s[t] == x) return t;
13 | else if(s[t] < x) low = t + 1;
14 | else high = mid - 1; //or t-1, (mid, t)为空字符串
15 | }
16 | }
17 | return -1;
18 | }
19 | int main(){
20 | string s[13] = {
21 | "at", "", "", "", "ball", "", "", "car", "", "", "dad", "", ""
22 | };
23 | cout<
2 | #include
3 | using namespace std;
4 |
5 | int** My2DAlloc(int rows, int cols){
6 | int **arr = (int**)malloc(rows*sizeof(int*));
7 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | void print_binary(int x){
6 | string s = "";
7 | for(int i=0; i<32 && x!=0; ++i, x >>= 1){
8 | if(x&1) s = "1" + s;
9 | else s = "0" + s;
10 | }
11 | cout<> 1) & 0x55555555);
15 | }
16 | // x & 0xAAAAAAAA得出结果是unsigned,所以最高位为1时,右移1位,最高位是0
17 | int swap_bits1(int x){
18 | return ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
19 | }
20 | int main(){
21 | int x = 0xFFFFFFFF;//-7665543;
22 | x = x & 0xFFFFFFFF;
23 | cout<<(x & 0xFFFFFFFF)<> 1);
25 | print_binary(x);
26 | print_binary(swap_bits(x));
27 | print_binary(swap_bits1(x));
28 | return 0;
29 | }
30 |
--------------------------------------------------------------------------------
/13.1.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | using namespace std;
4 |
5 | void printLastKLines(ifstream &fin, int k){
6 | string line[k];
7 | int lines = 0;
8 | string tmp;
9 | while(getline(fin, tmp)){//&& !fin.eof()
10 | line[lines%k] = tmp;
11 | ++lines;
12 | }
13 | // while(!fin.eof()){
14 | // getline(fin, line[lines%k]);
15 | // ++lines;
16 | // }
17 | int start, cnt;
18 | if(lines < k){
19 | start = 0;
20 | cnt = lines;
21 | }
22 | else{
23 | start = lines%k;
24 | cnt = k;
25 | }
26 | for(int i=0; i
2 | using namespace std;
3 |
4 | bool g_Invalid = false;
5 |
6 | int GetMaxSum(int a[], int n){
7 | if(a==NULL || n<=0){
8 | g_Invalid = true;
9 | return 0;
10 | }
11 | g_Invalid = false;
12 |
13 | int max_sum = 1<<31; // Min Int
14 | int cur_sum = 0;
15 | for(int i=0; i max_sum)
22 | max_sum = cur_sum;
23 | }
24 |
25 | return max_sum;
26 | }
27 | int main(){
28 | int a[] = {
29 | -2, -8, 3, -2, 4, -10
30 | };
31 | int max_sum = GetMaxSum(a, 6);
32 | if(g_Invalid)
33 | cout<<"Invalid Input!"<
2 | using namespace std;
3 |
4 | int c[20], n=8, cnt=0;
5 | void print(){
6 | for(int i=0; i
2 | using namespace std;
3 |
4 | int search(int a[], int low, int high, int x){
5 | while(low <= high){
6 | int mid = low + (high - low)/2;
7 | if(a[mid] == x) return mid;
8 | if(a[mid] >= a[low]) {
9 | if(x=a[low])
10 | high = mid - 1;
11 | else
12 | low = mid + 1;
13 | }
14 | else {
15 | if(x>a[mid] && x
2 | using namespace std;
3 |
4 | void swap(int &a, int &b){
5 | int t = a;
6 | a = b;
7 | b = t;
8 | }
9 | void transpose(int a[][4], int n){
10 | for(int i=0; i
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | string print_binary(string val){
7 | int pos = val.find('.', 0);
8 | int intpart = atoi(val.substr(0, pos).c_str());
9 | double decpart = atof(val.substr(pos, val.length()-pos).c_str());
10 | string intstr = "", decstr = "";
11 | while(intpart > 0){
12 | if(intpart&1) intstr = "1" + intstr;
13 | else intstr = "0" + intstr;
14 | intpart >>= 1;
15 | }
16 | while(decpart > 0){
17 | if(decstr.length() > 32) return "ERROR";
18 | decpart *= 2;
19 | if(decpart >= 1){
20 | decstr += "1";
21 | decpart -= 1;
22 | }
23 | else
24 | decstr += "0";
25 | }
26 | return intstr + "." + decstr;
27 | }
28 | int main(){
29 | string val = "19.25";
30 | cout<
2 | using namespace std;
3 |
4 | const int kMaxInt = ~(1<<31);
5 |
6 | int ShortestDist(string text[], int n, string word1, string word2){
7 | int min = kMaxInt / 2;
8 | int pos1 = -min;
9 | int pos2 = -min;
10 |
11 | for(int pos=0; pos
2 | using namespace std;
3 |
4 | class Bitmap{
5 | public:
6 | Bitmap(int size = 32){
7 | bits = new int[size/32 + 1];
8 | }
9 | ~Bitmap(){
10 | delete[] bits;
11 | }
12 | bool get(int pos){// true if bit is 1, else: false
13 | return (bits[pos/32] & (1<<(pos&0x1f))) != 0;
14 | }
15 | void set(int pos){
16 | bits[pos/32] |= (1<<(pos&0x1f));
17 | }
18 | private:
19 | int *bits;
20 | };
21 |
22 | void print_duplicates(int a[], int n, int bitsize){
23 | Bitmap bm(bitsize);
24 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | void print_binary(int n){
6 | vector v;
7 | int len = 8 * sizeof(int);
8 | int mask = 1;
9 | while(len--){
10 | if(n&mask) v.push_back(1);
11 | else v.push_back(0);
12 | mask <<= 1;
13 | }
14 | while(!v.empty()){
15 | cout<>(j+1)) << (j+1)) | (m<
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | bool isAnagram1(string s, string t){
7 | if(s=="" || t=="") return false;
8 | if(s.length() != t.length()) return false;
9 |
10 | sort(&s[0], &s[0]+s.length());
11 | sort(&t[0], &t[0]+t.length());
12 | if(s == t) return true;
13 | else return false;
14 | }
15 | bool isAnagram(string s, string t){
16 | if(s=="" || t=="") return false;
17 | if(s.length() != t.length()) return false;
18 |
19 | int len = s.length();
20 | int c[256];
21 | memset(c, 0, sizeof(c));
22 | for(int i=0; i
2 | #include
3 | #include
4 | #include
5 | using namespace std;
6 |
7 | void Qsort(stack &s){
8 | priority_queue< int,vector,greater > q;
9 | while(!s.empty()){
10 | q.push(s.top());
11 | s.pop();
12 | }
13 | while(!q.empty()){
14 | s.push(q.top());
15 | q.pop();
16 | }
17 | }
18 |
19 | stack Ssort(stack s){
20 | stack t;
21 | while(!s.empty()){
22 | int data = s.top();
23 | s.pop();
24 | while(!t.empty() && t.top()>data){
25 | s.push(t.top());
26 | t.pop();
27 | }
28 | t.push(data);
29 | }
30 | return t;
31 | }
32 |
33 | int main(){
34 | srand((unsigned)time(0));
35 | stack s;
36 |
37 | for(int i=0; i<10; ++i)
38 | s.push((rand()%100));
39 | s = Ssort(s);
40 | //Qsort(s);
41 | while(!s.empty()){
42 | cout<
2 | #include
3 | #include
4 | #include
5 | using namespace std;
6 |
7 | const int maxn = 100;
8 | bool g[maxn][maxn], visited[maxn];
9 | int n;
10 | queue q;
11 |
12 | void init(){
13 | memset(g, false, sizeof(g));
14 | memset(visited, false, sizeof(visited));
15 | }
16 | bool route(int src, int dst){
17 | q.push(src);
18 | visited[src] = true;
19 | while(!q.empty()){
20 | int t = q.front();
21 | q.pop();
22 | if(t == dst) return true;
23 | for(int i=0; i>n>>m;
37 | for(int i=0; i>u>>v;
39 | g[u][v] = true;
40 | }
41 | cout<
2 | #include
3 | using namespace std;
4 |
5 |
6 | int main(){
7 | // freopen("12.3.in", "w", stdout);
8 | // int miss = 12345;
9 | // for(int i=0; i<20000; ++i){
10 | // if(i == miss) continue;
11 | // cout<
2 | #include
3 | using namespace std;
4 |
5 | struct op{
6 | int begin, end;
7 | char src, bri, dst;
8 | op(){
9 |
10 | }
11 | op(int pbegin, int pend, int psrc, int pbri, int pdst):begin(pbegin), end(pend), src(psrc), bri(pbri), dst(pdst){
12 |
13 | }
14 | };
15 | void hanoi(int n, char src, char bri, char dst){
16 | stack st;
17 | op tmp;
18 | st.push(op(1, n, src, bri, dst));
19 | while(!st.empty()){
20 | tmp = st.top();
21 | st.pop();
22 | if(tmp.begin != tmp.end){
23 | st.push(op(tmp.begin, tmp.end-1, tmp.bri, tmp.src, tmp.dst));
24 | st.push(op(tmp.end, tmp.end, tmp.src, tmp.bri, tmp.dst));
25 | st.push(op(tmp.begin, tmp.end-1, tmp.src, tmp.dst, tmp.bri));
26 | }
27 | else{
28 | cout<<"Move disk "<
2 | #include
3 | using namespace std;
4 |
5 | int mini(int a, int b){
6 | return a < b ? a : b;
7 | }
8 | int mini(int a, int b, int c){
9 | return mini(mini(a, b), c);
10 | }
11 | int get_num(int k){
12 | if(k <= 0) return 0;
13 | int res = 1, cnt = 1;
14 | queue q3, q5, q7;
15 | q3.push(3); q5.push(5); q7.push(7);
16 | for(; cnt
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | const int maxn = 100;
7 | struct Node{
8 | int key;
9 | Node *lchild, *rchild, *parent;
10 | };
11 | Node *p, node[maxn];
12 | int cnt;
13 |
14 | void init(){
15 | p = NULL;
16 | memset(node, '\0', sizeof(node));
17 | cnt = 0;
18 | }
19 | void create_minimal_tree(Node* &head, Node *parent, int a[], int start, int end){
20 | if(start <= end){
21 | int mid = (start + end)>>1;
22 | node[cnt].key = a[mid];
23 | node[cnt].parent = parent;
24 | head = &node[cnt++];
25 | create_minimal_tree(head->lchild, head, a, start, mid-1);
26 | create_minimal_tree(head->rchild, head, a, mid+1, end);
27 | }
28 | }
29 | int height(Node *head){
30 | if(head == NULL) return 0;
31 | return max(height(head->lchild), height(head->rchild)) + 1;
32 | }
33 | int main(){
34 | init();
35 | int a[] = {
36 | 0, 1, 2, 3, 4, 5, 6, 7, 8
37 | };
38 | Node *head = NULL;
39 | create_minimal_tree(head, NULL, a, 0, 8);
40 | cout<
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | void zero(int **a, int m, int n){
7 | bool row[m], col[n];
8 | memset(row, false, sizeof(row));
9 | memset(col, false, sizeof(col));
10 | for(int i=0; i>m>>n;
27 | int **a;
28 | a = new int*[m];
29 | for(int i=0; i>a[i][j];
34 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | typedef vector vs;
6 |
7 | vs permu(string s){
8 | vs result;
9 | if(s == ""){
10 | result.push_back("");
11 | return result;
12 | }
13 | string c = s.substr(0, 1);
14 | vs res = permu(s.substr(1));
15 | for(int i=0; i
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | const int maxn = 100;
7 | struct person{
8 | int h, w;
9 | };
10 | person p[maxn];
11 | int d[maxn];
12 |
13 | bool cmp(person p1, person p2){
14 | if(p1.h == p2.h) return p1.w < p2.w;
15 | else return p1.h < p2.h;
16 | }
17 | int lis(person p[], int n){
18 | int k = 1;
19 | d[0] = p[0].w;
20 | for(int i=1; i d[k-1]) d[k++] = p[i].w;
22 | else{
23 | int j;
24 | for(j=k-1; j>=0 && d[j]>p[i].w; --j);//用二分可将复杂度降到O(nlogn)
25 | d[j+1] = p[i].w;
26 | }
27 | }
28 | return k;
29 | }
30 | int lis1(person p[], int n) {
31 | int k = 1;
32 | person d[n];
33 | d[0] = p[0];
34 | for(int i=1; id[k-1].w && p[i].h>d[k-1].h) d[k++] = p[i];
36 | else {
37 | int j;
38 | for(j=k-1; j>=0 && (p[i].w<))
39 | }
40 | }
41 | }
42 | int main(){
43 | freopen("9.7.in", "r", stdin);
44 | int n;
45 | cin>>n;
46 | for(int i=0; i>p[i].h>>p[i].w;
48 | sort(p, p+n, cmp);
49 | cout<
2 | #include
3 | using namespace std;
4 |
5 | bool isUnique1(string s)
6 | {
7 | bool a[256];
8 | memset(a, 0, sizeof(a));
9 | int len = s.length();
10 | for(int i=0; i
2 | #include
3 | using namespace std;
4 |
5 | const int MAX_N = 100;
6 | int p[MAX_N][MAX_N], A[MAX_N][MAX_N];
7 |
8 | void PreCompute(int n){
9 | for(int i=0; i<=n; ++i)
10 | p[0][i] = p[i][0] = 0;
11 | for(int i=1; i<=n; ++i)
12 | for(int j=1; j<=n; ++j)
13 | p[i][j] = p[i-1][j] + p[i][j-1] - p[i-1][j-1] + A[i][j];
14 | }
15 |
16 | int MaxSum(int n){
17 | int max_sum = 1<<31; //min int
18 | for(int i=1; i<=n; ++i)
19 | for(int j=i; j<=n; ++j){
20 | int cur_sum = 0;
21 | for(int k=1; k<=n; ++k){
22 | int val = p[j][k]-p[j][k-1]-p[i-1][k]+p[i-1][k-1];
23 | if(cur_sum <= 0)
24 | cur_sum = val;
25 | else
26 | cur_sum += val;
27 |
28 | if(cur_sum > max_sum)
29 | max_sum = cur_sum;
30 | }
31 | }
32 |
33 | return max_sum;
34 | }
35 |
36 | int main(){
37 | freopen("20.12.in", "r", stdin);
38 | int n;
39 | cin>>n;
40 | for(int i=1; i<=n; ++i)//元素存储从1开始
41 | for(int j=1; j<=n; ++j)
42 | cin>>A[i][j];
43 | PreCompute(n);
44 | cout<
2 | #include
3 | using namespace std;
4 |
5 | int fetch(int a[], int i, int j){
6 | return (a[i] >> j) & 1; //return 0/1
7 | }
8 | int get(int a[], int i){
9 | int ret = 0;
10 | for(int j=31; j>=0; --j)
11 | ret = (ret << 1) | fetch(a, i, j);
12 | return ret;
13 | }
14 | int missing(int a[], int n){
15 | bool *b = new bool[n+1];
16 | memset(b, false, (n+1)*sizeof(bool));
17 | for(int i=0; i> (j % 32)) & 1;
26 | }
27 | int get1(int a[], int i){
28 | int ret = 0;
29 | int base = 32*i;
30 | for(int j=base+31; j>=base; --j)
31 | ret = (ret << 1) | fetch1(a, j);
32 | return ret;
33 | }
34 | int missing1(int a[], int n){
35 | bool *b = new bool[n+1];
36 | memset(b, false, (n+1)*sizeof(bool));
37 | for(int i=0; i
2 | using namespace std;
3 |
4 | typedef struct node{
5 | int data;
6 | node *next;
7 | }node;
8 |
9 | node* init(int a[], int n){
10 | node *head, *p;
11 | for(int i=0; idata = a[i];
14 | if(i==0){
15 | head = p = nd;
16 | continue;
17 | }
18 | p->next = nd;
19 | p = nd;
20 | }
21 | return head;
22 | }
23 |
24 | bool remove(node *c){
25 | if(c==NULL || c->next==NULL) return false;
26 | // if(c->next==NULL){//c为最后一个元素时直接删除,不行,最后还是会打印出一个为0的结点,需要特殊处理
27 | // delete c;
28 | // return;
29 | // }
30 | node *q = c->next;
31 | c->data = q->data;
32 | c->next = q->next;
33 | delete q;
34 | return true;
35 | }
36 | void print(node *head){
37 | while(head){
38 | cout<data<<" ";
39 | head = head->next;
40 | }
41 | cout<next;
53 | print(head);
54 | if(remove(c))
55 | print(head);
56 | else
57 | cout<<"failure"<
2 | using namespace std;
3 |
4 | const int INF = ~(1<<31);
5 |
6 | void swap(int &a, int &b){
7 | a = a^b;
8 | b = a^b;
9 | a = a^b;
10 | }
11 | int flipsign(int a){
12 | int d = a < 0 ? 1 : -1;
13 | int opa = 0;
14 | while(a != 0){
15 | a += d;
16 | opa += d;
17 | }
18 | return opa;
19 | }
20 | int abs(int a){
21 | if(a < 0) a = flipsign(a);
22 | return a;
23 | }
24 | bool opsign(int a, int b){
25 | return (a>0 && b<0) || (a<0 && b>0);
26 | }
27 | int times(int a, int b){
28 | int aa = abs(a), bb = abs(b);
29 | int res = 0;
30 | if(aa < bb) swap(aa, bb);
31 | for(int i=0; i=0; ++res);
43 | if(opsign(a, b)) res = flipsign(res);
44 | return res;
45 | }
46 | int main(){
47 | int a[] = {
48 | 8, 0, -8, -5, 9
49 | };
50 | int b[] = {
51 | 3, 5, 3, 0, -3
52 | };
53 | for(int i=0; i<5; ++i){
54 | cout<
2 | using namespace std;
3 |
4 | typedef struct node{
5 | int data;
6 | node *next;
7 | }node;
8 |
9 | node* init(int a[], int n){
10 | node *head, *p;
11 | for(int i=0; idata = a[i];
14 | if(i==0){
15 | head = p = nd;
16 | continue;
17 | }
18 | p->next = nd;
19 | p = nd;
20 | }
21 | return head;
22 | }
23 |
24 | node* findNthToLast(node *head, int n){
25 | if(head==NULL || n<1) return NULL;
26 | node *p=head, *q=head;
27 | while(n>0 && q){
28 | q = q->next;
29 | --n;
30 | }
31 | if(n>0) return NULL;
32 | while(q){
33 | p = p->next;
34 | q = q->next;
35 | }
36 | return p;
37 | }
38 | node *pp;
39 | int nn;
40 | void findNthToLast1(node *head){
41 | if(head==NULL) return;
42 | findNthToLast1(head->next);
43 | if(nn==1) pp = head;
44 | --nn;
45 | }
46 | int main(){
47 | int n = 10;
48 | int a[] = {
49 | 9, 2, 1, 3, 5, 6, 2, 6, 3, 1
50 | };
51 | node *head = init(a, n);
52 | node *p = findNthToLast(head, 6);
53 | if(p) cout<data<data<
2 | #include
3 | using namespace std;
4 |
5 | int main(){
6 | freopen("12.3.in", "r", stdin);// 20000 number
7 | int int_len = sizeof(int) * 8;
8 | int totalnum = 20000;
9 | int blocksize = 2000;
10 | int blocknum = totalnum / blocksize;
11 | int* block = new int[blocknum];
12 | int* bit = new int[blocksize/int_len+1];
13 | int v;
14 | while(scanf("%d", &v) != EOF){
15 | ++block[v/blocksize];
16 | }
17 | fclose(stdin);
18 | int start;
19 | for(int i=0; i=start && v
2 | #include
3 | using namespace std;
4 |
5 | class Trie{
6 | public:
7 | static const int MAX_N = 100 * 100;// 100为主串长度
8 | static const int CLD_NUM = 26;
9 | int size;
10 | int trie[MAX_N][CLD_NUM];
11 |
12 | Trie(const char* s);
13 | void insert(const char* s);
14 | bool find(const char* s);
15 | };
16 |
17 | Trie::Trie(const char* s){
18 | memset(trie[0], -1, sizeof(trie[0]));
19 | size = 1;
20 | while(*s){
21 | insert(s);
22 | ++s;
23 | }
24 | }
25 |
26 | void Trie::insert(const char* s){
27 | int p = 0;
28 | while(*s){
29 | int i = *s - 'a';
30 | if(-1 == trie[p][i]){
31 | memset(trie[size], -1, sizeof(trie[size]));
32 | trie[p][i] = size++;
33 | }
34 | p = trie[p][i];
35 | ++s;
36 | }
37 | }
38 |
39 | bool Trie::find(const char* s){
40 | int p = 0;
41 | while(*s){
42 | int i = *s - 'a';
43 | if(-1 == trie[p][i])
44 | return false;
45 | p = trie[p][i];
46 | ++s;
47 | }
48 | return true;
49 | }
50 |
51 | int main(){
52 | Trie tree("mississippi");
53 | string patt[] = {
54 | "is", "sip", "hi", "sis", "mississippa"
55 | };
56 | int n = 5;
57 | for(int i=0; i
2 | #include
3 | #include "hash.h"
4 | using namespace std;
5 |
6 | Hash hash;
7 |
8 | inline bool cmp(string s1, string s2){//按长度从大到小排
9 | return s2.length() < s1.length();
10 | }
11 |
12 | bool MakeOfWords(string word, int length){
13 | //cout<<"curr: "<
2 |
3 | const int kWordSize = 26 + 5;
4 | const int kNodeSize = 1200 + 5;
5 | const int kHashSize = 10001; //大质数
6 |
7 | struct Node{
8 | char word[kWordSize];
9 | Node *next;
10 | };
11 | Node node[kNodeSize + 1];
12 | Node* head[kHashSize + 1];
13 |
14 | class Hash{
15 | public:
16 | Hash();
17 | unsigned int hash(const char* str);
18 | void insert(const char* str);
19 | bool find(const char* str);
20 | private:
21 | unsigned int seed;
22 | unsigned int size;
23 | };
24 |
25 | Hash::Hash():seed(131),size(0){
26 | memset(head, 0, sizeof(head));
27 | }
28 |
29 | unsigned int Hash::hash(const char* str){
30 | unsigned int hash = 0;
31 | while(*str++)
32 | hash = hash * seed + (*str);
33 | return (hash & 0x7FFFFFFF) % kHashSize;
34 | }
35 |
36 | void Hash::insert(const char* str){
37 | unsigned int id = hash(str);
38 | char *dst = (char*)node[size].word;
39 | while(*dst++ = *str++);
40 | node[size].next = head[id];
41 | head[id] = &node[size];
42 | ++size;
43 | }
44 |
45 | bool Hash::find(const char* str){
46 | unsigned int id = hash(str);
47 | for(Node* p=head[id]; p ; p=p->next){
48 | char *dst = (char*)p->word;
49 | int i = 0;
50 | while(*(str+i) && *(dst+i)==*(str+i))
51 | ++i;
52 | if(*(str+i)=='\0' && *(dst+i)=='\0')
53 | return true;
54 | }
55 | return false;
56 | }
57 |
--------------------------------------------------------------------------------
/4.5.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | using namespace std;
4 |
5 | const int maxn = 100;
6 | struct Node{
7 | int key;
8 | Node *lchild, *rchild, *parent;
9 | };
10 | Node *p, node[maxn];
11 | int cnt;
12 |
13 | void init(){
14 | p = NULL;
15 | memset(node, '\0', sizeof(node));
16 | cnt = 0;
17 | }
18 | void create_minimal_tree(Node* &head, Node *parent, int a[], int start, int end){
19 | if(start <= end){
20 | int mid = (start + end)>>1;
21 | node[cnt].key = a[mid];
22 | node[cnt].parent = parent;
23 | head = &node[cnt++];
24 | create_minimal_tree(head->lchild, head, a, start, mid-1);
25 | create_minimal_tree(head->rchild, head, a, mid+1, end);
26 | }
27 | }
28 | Node* minimal(Node* no){
29 | if(no == NULL) return NULL;
30 | while(no->lchild)
31 | no = no->lchild;
32 | return no;
33 | }
34 | Node* successor(Node* no){
35 | if(no == NULL) return NULL;
36 | if(no->rchild) return minimal(no->rchild);
37 | Node *y = no->parent;
38 | while(y && y->rchild==no){
39 | no = y;
40 | y = y->parent;
41 | }
42 | return y;
43 | }
44 | int main(){
45 | int a[] = {
46 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
47 | };
48 | init();
49 | Node *head = NULL;
50 | create_minimal_tree(head, NULL, a, 0, 9);
51 | cout<<"the head is "<key<key<
2 | #include
3 | #include
4 | using namespace std;
5 |
6 | enum color{
7 | red, yellow, blue, green
8 | };
9 |
10 | bool paint_fill(color **screen, int m, int n, int x, int y, color c){
11 | if(x<0 || x>=m || y<0 || y>=n) return false;
12 | if(screen[x][y] == c) return false;
13 | else{
14 | screen[x][y] = c;
15 | paint_fill(screen, m, n, x-1, y, c);
16 | paint_fill(screen, m, n, x+1, y, c);
17 | paint_fill(screen, m, n, x, y-1, c);
18 | paint_fill(screen, m, n, x, y+1, c);
19 | }
20 | return true;
21 | }
22 | int main(){
23 | freopen("8.6.in", "r", stdin);
24 | int m, n;
25 | cin>>m>>n;
26 | color **screen = new color*[m];
27 | for(int i=0; i>t;
33 | screen[i][j]=(color)t;
34 | }
35 |
36 | // color screen[5][5] = {
37 | // {red, green, green, blue, yellow},
38 | // {green, red, yellow, green, green},
39 | // {green, green, red, blue, green},
40 | // {red, green, green, green, yellow},
41 | // {red, yellow, red, blue, yellow}
42 | // };
43 | paint_fill(screen, 5, 5, 1, 2, green);
44 | for(int i=0; i<5; ++i){
45 | for(int j=0; j<5; ++j)
46 | cout<
2 | using namespace std;
3 |
4 | typedef long long ll;
5 | ll fib(ll n){
6 | if(n < 1) return -1;
7 | if(n == 1 || n == 2) return 1;
8 | else return fib(n-1) + fib(n-2);
9 | }
10 | ll fib1(ll n){
11 | if(n < 1) return -1;
12 | if(n == 1 || n == 2) return 1;
13 | ll a = 1, b = 1;
14 | for(ll i=3; i<=n; ++i){
15 | ll c = a + b;
16 | a = b;
17 | b = c;
18 | }
19 | return b;
20 | }
21 | void mul(ll c[2][2], ll a[2][2], ll b[2][2]){
22 | ll t[4];
23 | t[0] = a[0][0]*b[0][0] + a[0][1]*b[1][0];
24 | t[1] = a[0][0]*b[0][1] + a[0][1]*b[1][1];
25 | t[2] = a[1][0]*b[0][0] + a[1][1]*b[1][0];
26 | t[3] = a[1][0]*b[0][1] + a[1][1]*b[1][1];
27 | c[0][0] = t[0];
28 | c[0][1] = t[1];
29 | c[1][0] = t[2];
30 | c[1][1] = t[3];
31 | }
32 | void pow(ll s[2][2], ll a[2][2], ll n){
33 | while(n > 0){
34 | if(n&1) mul(s, s, a);
35 | mul(a, a, a);
36 | n >>= 1;
37 | }
38 | }
39 | ll fib2(ll n){
40 | if(n < 1) return -1;
41 | if(n == 1 || n == 2) return 1;
42 |
43 | ll a[2][2] = { {1, 1}, {1, 0} };
44 | ll s[2][2] = { {1, 0}, {0, 1} };
45 | pow(s, a, n-2);
46 | return s[0][0] + s[0][1];
47 | }
48 | int main(){
49 | for(int i=1; i<20; ++i)
50 | cout<
2 | using namespace std;
3 |
4 | int cnt = 0;
5 | void sumN(int sum, int c, int n){
6 | if(sum >= n){
7 | if(sum == n) ++cnt;
8 | return;
9 | }
10 | else{
11 | if(c >= 25)
12 | sumN(sum+25, 25, n);
13 | if(c >= 10)
14 | sumN(sum+10, 10, n);
15 | if(c >= 5)
16 | sumN(sum+5, 5, n);
17 | if(c >= 1)
18 | sumN(sum+1, 1, n);
19 | }
20 | }
21 | int sum_n(int sum, int c, int n){
22 | int ways = 0;
23 | if(sum <= n){
24 | if(sum == n) return 1;
25 | if(c >= 25)
26 | ways += sum_n(sum+25, 25, n);
27 | if(c >= 10)
28 | ways += sum_n(sum+10, 10, n);
29 | if(c >= 5)
30 | ways += sum_n(sum+5, 5, n);
31 | if(c >= 1)
32 | ways += sum_n(sum+1, 1, n);
33 | }
34 | return ways;
35 | }
36 | int make_change(int n, int denom){
37 | int next_denom = 0;
38 | switch(denom){
39 | case 25:
40 | next_denom = 10;
41 | break;
42 | case 10:
43 | next_denom = 5;
44 | break;
45 | case 5:
46 | next_denom = 1;
47 | break;
48 | case 1:
49 | return 1;
50 | }
51 | int ways = 0;
52 | for(int i=0; i*denom<=n; ++i)
53 | ways += make_change(n-i*denom, next_denom);
54 | return ways;
55 | }
56 | int main(){
57 | int n = 10;
58 | sumN(0, 25, n);
59 | cout<
2 | #include
3 | using namespace std;
4 |
5 | template
6 | class SmartPointer{
7 | public:
8 | SmartPointer(T* ptr){
9 | ref = ptr;
10 | ref_count = (unsigned*)malloc(sizeof(unsigned));
11 | *ref_count = 1;
12 | }
13 |
14 | SmartPointer(SmartPointer &sptr){
15 | ref = sptr.ref;
16 | ref_count = sptr.ref_count;
17 | ++*ref_count;
18 | }
19 |
20 | SmartPointer& operator=(SmartPointer &sptr){
21 | if (this != &sptr) {
22 | if (--*ref_count == 0){
23 | clear();
24 | cout<<"operator= clear"< sp1(ip1), sp2(ip2);
62 | SmartPointer spa = sp1;
63 | sp2 = spa;
64 | return 0;
65 | }
66 |
--------------------------------------------------------------------------------
/2.5.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include