亚洲欧美日韩一区二区三区在线,亚洲欧美日韩在线一区,日韩午夜在线http://www.shnenglu.com/Joe/category/14148.html堅信:勤能補拙zh-cnTue, 09 Nov 2010 19:58:17 GMTTue, 09 Nov 2010 19:58:17 GMT60PKU 2408 Anagram Groups (排序)http://www.shnenglu.com/Joe/archive/2010/11/05/132564.htmlsimplyzhaosimplyzhaoFri, 05 Nov 2010 07:38:00 GMThttp://www.shnenglu.com/Joe/archive/2010/11/05/132564.htmlhttp://www.shnenglu.com/Joe/comments/132564.htmlhttp://www.shnenglu.com/Joe/archive/2010/11/05/132564.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/132564.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/132564.html
Anagram Groups
Time Limit: 1000MSMemory Limit: 65536K
Total Submissions: 2318Accepted: 649

Description

World-renowned Prof. A. N. Agram's current research deals with large anagram groups. He has just found a new application for his theory on the distribution of characters in English language texts. Given such a text, you are to find the largest anagram groups. 

A text is a sequence of words. A word w is an anagram of a word v if and only if there is some permutation p of character positions that takes w to v. Then, w and v are in the same anagram group. The size of an anagram group is the number of words in that group. Find the 5 largest anagram groups.

Input

The input contains words composed of lowercase alphabetic characters, separated by whitespace(or new line). It is terminated by EOF. You can assume there will be no more than 30000 words.

Output

Output the 5 largest anagram groups. If there are less than 5 groups, output them all. Sort the groups by decreasing size. Break ties lexicographically by the lexicographical smallest element. For each group output, print its size and its member words. Sort the member words lexicographically and print equal words only once.

Sample Input

undisplayed
trace
tea
singleton
eta
eat
displayed
crate
cater
carte
caret
beta
beat
bate
ate
abet

Sample Output

Group of size 5: caret carte cater crate trace .
Group of size 4: abet bate beat beta .
Group of size 4: ate eat eta tea .
Group of size 1: displayed .
Group of size 1: singleton .

Source

思路:
這題將排序發(fā)揮到了極致啊呵呵,排序來排序去就AC了

代碼:
 1 /* 47MS */
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #define MAX_NUM 30001
 6 #define MAX_LEN 36
 7 #define MAX_OUT 5
 8 struct Word {
 9     char word[MAX_LEN];
10     char word_cmp[MAX_LEN];
11 } words[MAX_NUM];
12 
13 struct Summary {
14     struct Word *first;
15     int count;
16 } smmry[MAX_NUM];
17 
18 int total, total_category;
19 
20 int
21 cmp_char(const void *arg1, const void *arg2)
22 {
23     return (*(char *)arg1) - (*(char *)arg2);
24 }
25 
26 int
27 cmp_words(const void *arg1, const void *arg2)
28 {
29     int ret = strcmp(((struct Word *)arg1)->word_cmp, ((struct Word *)arg2)->word_cmp);
30     if(ret == 0)
31         ret = strcmp(((struct Word *)arg1)->word, ((struct Word *)arg2)->word);
32     return ret;
33 }
34 
35 int
36 cmp_category(const void *arg1, const void *arg2)
37 {
38     int ret = ((struct Summary *)arg2)->count - ((struct Summary *)arg1)->count;
39     if(ret == 0)
40         ret = strcmp(((struct Summary *)arg1)->first->word, ((struct Summary *)arg2)->first->word);
41     return ret;
42 }
43 
44 int
45 main(int argc, char **argv)
46 {
47     int i, j, num, len;
48     total = total_category = 0;
49     while(scanf("%s", words[total].word) != EOF) {
50         len = strlen(words[total].word);
51         strcpy(words[total].word_cmp, words[total].word);
52         qsort(words[total].word_cmp, len, sizeof(char), cmp_char); 
53         ++total;
54     }
55     qsort(words, total, sizeof(struct Word), cmp_words);
56 
57     num = 1;
58     for(i=1; i<total; i++) {
59         if(strcmp(words[i].word_cmp, words[i-1].word_cmp) == 0)
60             ++num;
61         else {
62             smmry[total_category].first = words+i-num;
63             smmry[total_category].count = num;
64             ++total_category;
65             num = 1;
66         }
67     }
68     smmry[total_category].first = words+i-num;
69     smmry[total_category++].count = num;
70     qsort(smmry, total_category, sizeof(struct Summary), cmp_category);
71 
72     total_category = total_category < MAX_OUT ? total_category : MAX_OUT;
73     for(i=0; i<total_category; i++) {
74         printf("Group of size %d: %s ", smmry[i].count, smmry[i].first->word);
75         for(j=1; j<smmry[i].count; j++)
76             if(strcmp((smmry[i].first+j)->word, (smmry[i].first+j-1)->word) != 0)
77                 printf("%s ", (smmry[i].first+j)->word);
78         printf(".\n");
79     }
80 }


simplyzhao 2010-11-05 15:38 發(fā)表評論
]]>
PKU 2418 Hardwood Specieshttp://www.shnenglu.com/Joe/archive/2010/10/30/131801.htmlsimplyzhaosimplyzhaoFri, 29 Oct 2010 16:59:00 GMThttp://www.shnenglu.com/Joe/archive/2010/10/30/131801.htmlhttp://www.shnenglu.com/Joe/comments/131801.htmlhttp://www.shnenglu.com/Joe/archive/2010/10/30/131801.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/131801.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/131801.htmlhttp://poj.org/problem?id=2418

思路:
題意清晰明了,不難,用三種方法分別實現(xiàn):
快速排序
動態(tài)生成節(jié)點的二叉查找樹
靜態(tài)分配節(jié)點的二叉查找樹

結(jié)果發(fā)現(xiàn),原來對于快速排序與靜態(tài)分配節(jié)點都不是很熟悉,二維數(shù)組的快速排序分析見http://www.shnenglu.com/Joe/archive/2010/10/29/131746.html,而動態(tài)生成節(jié)點則需要注意如果函數(shù)需要修改指針,那么必須傳遞指向指針的指針,因為C是值傳遞的

另外,我以為靜態(tài)分配節(jié)點應(yīng)該比動態(tài)分配節(jié)點節(jié)約很多時間的,結(jié)果居然差不多...而快速排序在這題明顯是最耗時的

代碼(快排)
 1 /* 35640K 1844MS */
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #define MAX_LEN 36
 6 #define MAX_NUM 1000001
 7 char species[MAX_NUM][MAX_LEN];
 8 
 9 int
10 cmp(const void *arg1, const void *arg2)
11 {
12     return strcmp((char *)arg1, (char *)arg2);
13 }
14 
15 int
16 main(int argc, char **argv)
17 {
18     int i, count, total = 0;
19     while(gets(species[total]) != NULL)
20         ++total;
21     qsort(species, total, sizeof(species[0]), cmp);
22     count = 1;
23     for(i=1; i<total; i++) {
24         if(strcmp(species[i], species[i-1]) == 0
25             ++count;
26         else {
27             printf("%s %.4f\n", species[i-1], (count*100.0)/total);
28             count = 1;
29         }
30     }
31     printf("%s %.4f\n", species[total-1], (count*100.0)/total);
32 }

代碼(動態(tài)分配節(jié)點的BST,原本想實現(xiàn)下destroy函數(shù)的,結(jié)果怕麻煩就留給系統(tǒng)回收吧(*^__^*) 嘻嘻……)
 1 /* binary search tree(dynamic allocation) */
 2 /* 544K 1188MS */
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<assert.h>
 7 #define MAX_LEN 36
 8 struct Node {
 9     char spec[MAX_LEN];
10     int count;
11     struct Node *left, *right;
12 };
13 int total;
14 
15 struct Node *
16 create_node(char *str)
17 {    
18     struct Node *node = (struct Node *)malloc(sizeof(struct Node));
19     assert(node != NULL);
20     strcpy(node->spec, str);
21     node->left = node->right = NULL;
22     node->count = 1;
23     return node;
24 }
25 
26 void
27 insert(struct Node **root, char *str)
28 {
29     int ret;
30     struct Node *node;
31     if(*root==NULL) {
32         *root = create_node(str);
33         return;
34     }
35     ret = strcmp((*root)->spec, str);
36     if(ret == 0)
37         ++((*root)->count);
38     else if(ret < 0)
39         insert(&((*root)->right), str);
40     else
41         insert(&((*root)->left), str);
42 }
43 
44 void
45 inorder(struct Node *root)
46 {
47     if(root == NULL)
48         return;
49     inorder(root->left);
50     printf("%s %.4f\n", root->spec, (root->count)*100.0/total);
51     inorder(root->right);
52 }
53 
54 void
55 destroy(struct Node **root)
56 {
57 }
58 
59 int
60 main(int argc, char **argv)
61 {
62     char str[MAX_LEN];
63     struct Node *bst = NULL;
64     total = 0;
65     while(gets(str) != NULL) {
66         ++total;
67         insert(&bst, str);
68     }
69     inorder(bst);
70 }

代碼(靜態(tài)分配節(jié)點的BST)
 1 /* binary search tree(static allocation) */
 2 /* 492K 1188MS */
 3 #include<stdio.h>
 4 #include<stdlib.h>
 5 #include<string.h>
 6 #include<assert.h>
 7 #define MAX_LEN 36
 8 #define MAX_NUM 10007
 9 #define ROOT 1
10 struct Node {
11     char spec[MAX_LEN];
12     int count;
13     int left, right;
14 }bst[MAX_NUM];
15 int cur_index, total;
16 
17 int
18 find(int root, char *str)
19 {
20     int ret, parent, cur = root;
21     while(cur != 0) {
22         parent = cur;
23         ret = strcmp(bst[cur].spec, str);
24         if(ret == 0) {
25             ++bst[cur].count;
26             return 0;
27         } else if(ret < 0) {
28             cur = bst[cur].right; 
29         } else {
30             cur = bst[cur].left;
31         }
32     }
33     return parent;
34 }
35 
36 #define ADD(index, str) { \
37     strcpy(bst[index].spec, str); \
38     bst[index].left = bst[index].right = 0; \
39     bst[index].count = 1; \
40     ++index; }
41 
42 void
43 insert(int parent, char *str)
44 {
45     int ret = strcmp(bst[parent].spec, str);
46     assert(ret != 0);
47     if(ret < 0)
48         bst[parent].right = cur_index;
49     else 
50         bst[parent].left = cur_index;
51     ADD(cur_index, str);
52 }
53 
54 void
55 inorder(int index) 
56 {
57     if(index == 0)
58         return;
59     inorder(bst[index].left);
60     printf("%s %.4f\n", bst[index].spec, (bst[index].count*100.0)/total);
61     inorder(bst[index].right);
62 }
63 
64 int
65 main(int argc, char **argv)
66 {
67     int parent;
68     char str[MAX_LEN];
69     total = 1;
70     cur_index = ROOT;
71     gets(str);
72     ADD(cur_index, str); /* create the root node first */
73     while(gets(str) != NULL) {
74         ++total;
75         if((parent=find(ROOT, str)) > 0)
76             insert(parent, str);
77     }
78     inorder(ROOT);
79 }



simplyzhao 2010-10-30 00:59 發(fā)表評論
]]>
[Tips][Original] qsort應(yīng)用于指針數(shù)組與二維數(shù)組(字符)的差異http://www.shnenglu.com/Joe/archive/2010/10/29/131746.htmlsimplyzhaosimplyzhaoFri, 29 Oct 2010 07:09:00 GMThttp://www.shnenglu.com/Joe/archive/2010/10/29/131746.htmlhttp://www.shnenglu.com/Joe/comments/131746.htmlhttp://www.shnenglu.com/Joe/archive/2010/10/29/131746.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/131746.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/131746.html在將qsort函數(shù)應(yīng)用于對指針數(shù)組與二維數(shù)組排序時,傳遞給compare函數(shù)的參數(shù)類型是不同的

首先,我們舉個簡單的例子,先將qsort對整數(shù)數(shù)組排序:
 1 int
 2 cmp(const void *arg1, const void *arg2)
 3 {
 4     return (*(int *)arg1)-(*(int *)arg2);
 5 }
 6 
 7 int
 8 main(int argc, char **argv)
 9 {
10     int i;
11     int arr[] = {31524};
12     qsort(arr, sizeof(arr)/sizeof(arr[0]), sizeof(int), cmp);
13 }
排序針對的是數(shù)組里的元素而言的,這里整數(shù)數(shù)組的元素就是整數(shù),因此qsort的第三個參數(shù)就是sizeof(int),而傳遞給比較函數(shù)cmp的參數(shù)就是相對應(yīng)的指向整數(shù)的指針

接著,我們來看看指針數(shù)組的情形:
 1 int
 2 cmp(const void *arg1, const void *arg2)
 3 {
 4     return strcmp((*(char **)arg1), (*(char **)arg2));
 5 }
 6 
 7 int
 8 main(int argc, char **argv)
 9 {
10     int i;
11     /* pointer array */
12     char *str[] = {"java""c""python""perl"}; 
13     qsort(str, sizeof(str)/sizeof(str[0]), sizeof(char *), cmp);
14 }
這里的理解其實跟整數(shù)數(shù)組差不多,關(guān)鍵是抓住數(shù)組里元素的類型,既然稱之為指針數(shù)組,那數(shù)組元素的類型自然就是指針,因此qsort的第三個參數(shù)就是sizeof(char *),而傳遞給比較函數(shù)cmp的參數(shù)就是相對應(yīng)的指向指針的指針,這里即char **類型

二維數(shù)組的理解最為復(fù)雜,代碼如下:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 
 5 int
 6 cmp1(const void *arg1, const void *arg2)
 7 {
 8     return strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2)));
 9 }
10 
11 int
12 cmp2(const void *arg1, const void *arg2)
13 {
14     return strcmp((char *)arg1, (char *)arg2);
15 }
16 
17 int
18 main(int argc, char **argv)
19 {
20     int i;
21     char str1[4][8= {"java""c""python""peal"};
22     printf("COMPARE-FUNCTION-1\n");
23     qsort(str1, 4sizeof(str1[0]), cmp1);
26 
27     char str2[4][8= {"java""c""python""peal"};
28     printf("COMPARE-FUNCTION-2\n");
29     qsort(str2, 4sizeof(str2[0]), cmp2);
34 }
這里cmp1與cmp2都能正常的工作(*^__^*) 嘻嘻……
還是按照上述方法來分析,抓住數(shù)組元素的類型來入手,二維數(shù)組實際上就是數(shù)組的數(shù)組,因此二維數(shù)組的元素類型就是一維數(shù)組,因此qsort的第三個參數(shù)就是sizeof(str1[0])或sizeof(str2[0]),那傳遞給比較函數(shù)的參數(shù)應(yīng)該就是指向數(shù)組的指針,這點可以通過gdb設(shè)置斷點來得到證實:
 1 (gdb) p &str1[0]
 2 $1 = (char (*)[8]) 0xbffff2cc
 3 (gdb) p &str1[1]
 4 $2 = (char (*)[8]) 0xbffff2d4
 5 
 6 Breakpoint 2, cmp1 (arg1=0xbffff2cc, arg2=0xbffff2d4) at char_test2.c:8
 7 8        return strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2)));
 8 (gdb) p arg1
 9 $3 = (const void *0xbffff2cc
10 (gdb) p arg2
11 $4 = (const void *0xbffff2d4
12 (gdb) p *(char (*)[])arg1
13 $5 = "j"
14 (gdb) p *(char (*)[8])arg1
15 $6 = "java\000\000\000"
通過第2行與第9行的比較可以發(fā)現(xiàn),比較函數(shù)的參數(shù)arg1其實就是&str1[0],類型為char (*)[],這也是為什么cmp1能正常工作的原因
那么cmp2呢,它為什么正確呢?
在cmp1中:strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2))); 這里傳遞給strcmp的參數(shù)之所以不會出錯,是因為我們將arg1解地址操作獲得一個數(shù)組,而數(shù)組名其實是指向數(shù)組首元素的指針,arg1既然是指向str1[0]這個一維數(shù)組的指針,而str1[0]本身其實就是指向這個一維數(shù)組的指針,也就是說arg1其實就是str1[0],因此cmp2能夠正常工作
1 (gdb) p &str1[0]
2 $3 = (char (*)[8]) 0xbffff2cc
3 (gdb) p &str1[0][0]
4 $4 = 0xbffff2cc "java"
5 (gdb) p arg1
6 $5 = (const void *0xbffff2cc
7 (gdb) p (char *)arg1
8 $6 = 0xbffff2cc "java"

額...貌似越說越復(fù)雜的樣子,不過這是我理解的過程,見諒...

simplyzhao 2010-10-29 15:09 發(fā)表評論
]]>
PKU 1089 Intervalshttp://www.shnenglu.com/Joe/archive/2010/10/17/130206.htmlsimplyzhaosimplyzhaoSun, 17 Oct 2010 11:35:00 GMThttp://www.shnenglu.com/Joe/archive/2010/10/17/130206.htmlhttp://www.shnenglu.com/Joe/comments/130206.htmlhttp://www.shnenglu.com/Joe/archive/2010/10/17/130206.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/130206.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/130206.htmlhttp://poj.org/problem?id=1089

思路:
根據(jù)interval的begin升序排列,然后對于interval A, B只存在三種情況:
A包含B、A與B相交、A與B分離

代碼:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define MAX_LEN 50001
 5 struct Interval {
 6     int begin, end;
 7 }itvs[MAX_LEN], target[MAX_LEN];
 8 int N, total;
 9 
10 int
11 compare(const void *arg1, const void *arg2)
12 {
13     struct Interval *= (struct Interval *)arg1;
14     struct Interval *= (struct Interval *)arg2;
15     if(a->begin == b->begin)
16         return a->end - b->end;
17     return a->begin - b->begin;
18 }
19 
20 void
21 init()
22 {
23     int i;
24     for(i=0; i<N; i++)
25         scanf("%d %d"&itvs[i].begin, &itvs[i].end);
26     qsort(itvs, N, sizeof(struct Interval), compare);
27     total = 0;
28 }
29 
30 void
31 solve()
32 {
33     int i;
34     struct Interval cur = itvs[0];
35     for(i=1; i<N; i++) {
36         if(itvs[i].begin > cur.end) {
37             target[total++= cur;
38             cur = itvs[i];
39         } else {
40             if(itvs[i].end > cur.end)
41                 cur.end = itvs[i].end;
42         }
43     }
44     target[total++= cur;
45 }
46 
47 void
48 output()
49 {
50     int i;
51     for(i=0; i<total; i++)
52         printf("%d %d\n", target[i].begin, target[i].end);
53 }
54 
55 int
56 main(int argc, char **argv)
57 {
58     while(scanf("%d"&N) != EOF) {
59         init();
60         solve();
61         output();
62     }
63 }


simplyzhao 2010-10-17 19:35 發(fā)表評論
]]>
PKU 1828 Monkeys' Pridehttp://www.shnenglu.com/Joe/archive/2010/09/08/126198.htmlsimplyzhaosimplyzhaoWed, 08 Sep 2010 15:41:00 GMThttp://www.shnenglu.com/Joe/archive/2010/09/08/126198.htmlhttp://www.shnenglu.com/Joe/comments/126198.htmlhttp://www.shnenglu.com/Joe/archive/2010/09/08/126198.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/126198.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/126198.htmlhttp://acm.pku.edu.cn/JudgeOnline/problem?id=1828

思路:
按照坐標從上到下、從左到右排序
首先想到的是O(n^2)的算法,時間需要1600+MS
然后,發(fā)現(xiàn)其實在排序之后只要從后向前掃描一遍即可得出結(jié)果

代碼:
 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define MAX_LEN 50001
 5 int n;
 6 struct Point {
 7     int x, y;
 8 }points[MAX_LEN];
 9 
10 int
11 compare(const void *arg1, const void *arg2)
12 {
13     struct Point *= (struct Point *)arg1;
14     struct Point *= (struct Point *)arg2;
15     if(a->== b->x)
16         return a->- b->y;
17     return a->- b->x;
18 }
19 
20 int
21 main(int argc, char **argv)
22 {
23     int i, j, cnt, ymax;
24     while(scanf("%d"&n)!=EOF && n) {
25         for(i=0; i<n; i++)
26             scanf("%d %d"&points[i].x, &points[i].y);
27         qsort(points, n, sizeof(struct Point), compare);
28         /* O(n^2) AC 1600+MS 
29         cnt = 0;
30         for(i=0; i<n; i++) {
31             for(j=i+1; j<n; j++) {
32                 if(points[j].y >= points[i].y)
33                     break;
34             }
35             if(j == n)
36                 ++cnt;
37         }
38         */
39         /* O(nlgn) AC 235MS */
40         cnt = 1;
41         ymax = points[n-1].y;
42         for(i=n-2; i>=0; i--) {
43             if(ymax < points[i].y) {
44                 ++cnt;
45                 ymax = points[i].y;
46             }
47         }
48         printf("%d\n", cnt);
49     }
50 }



simplyzhao 2010-09-08 23:41 發(fā)表評論
]]>
PKU 2388 Who's in the Middlehttp://www.shnenglu.com/Joe/archive/2010/07/04/119284.htmlsimplyzhaosimplyzhaoSun, 04 Jul 2010 02:19:00 GMThttp://www.shnenglu.com/Joe/archive/2010/07/04/119284.htmlhttp://www.shnenglu.com/Joe/comments/119284.htmlhttp://www.shnenglu.com/Joe/archive/2010/07/04/119284.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/119284.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/119284.htmlhttp://acm.pku.edu.cn/JudgeOnline/problem?id=2388

思路:
1. 排序
這題直接用快排就能AC,很水...

2. 求解第i個順序統(tǒng)計量(詳見CLRS)
   利用快速排序過程中的思路,期望時間復(fù)雜度是O(n)

   ps: partition函數(shù)的執(zhí)行過程是比較有意思的呵呵
 1 int 
 2 partition(long *arr, int begin, int end)
 3 {
 4     int i, j;
 5     i = begin;
 6     long pivot = arr[begin];
 7     for(j=begin+1; j<=end; j++)
 8         if(arr[j] <= pivot)
 9             swap(arr, ++i, j);
10     swap(arr, i, begin);
11     return i;
12 }
13 
14 long
15 find_ith_os(long *arr, int begin, int end, int ith)
16 {
17     if(begin == end)
18         return arr[begin];
19     int p = partition(arr, begin, end);
20     int k = p-begin+1;
21     if(k == ith)
22         return arr[p];
23     else if(ith < k)
24         return find_ith_os(arr, begin, p-1, ith);
25     else
26         return find_ith_os(arr, p+1, end, ith-k);
27 }






simplyzhao 2010-07-04 10:19 發(fā)表評論
]]>
PKU 1007 DNA Sorting/2299 Ultra-QuickSorthttp://www.shnenglu.com/Joe/archive/2010/07/04/119282.htmlsimplyzhaosimplyzhaoSun, 04 Jul 2010 02:07:00 GMThttp://www.shnenglu.com/Joe/archive/2010/07/04/119282.htmlhttp://www.shnenglu.com/Joe/comments/119282.htmlhttp://www.shnenglu.com/Joe/archive/2010/07/04/119282.html#Feedback0http://www.shnenglu.com/Joe/comments/commentRss/119282.htmlhttp://www.shnenglu.com/Joe/services/trackbacks/119282.html問題:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1007
http://acm.pku.edu.cn/JudgeOnline/problem?id=2299

思路:
求逆序?qū)Φ膫€數(shù)
這兩題的基本問題是一致的,給定一個數(shù)組(包括字符串),求出逆序?qū)Φ膫€數(shù)

1. 最簡單的方法
兩層循環(huán),復(fù)雜度O(n^2)
 1 int
 2 inversion_cal(char *str)
 3 {
 4     int i, j, count = 0;
 5     int len = strlen(str);
 6     for(i=0; i<len; i++)
 7         for(j=i+1; j<len; j++)
 8             if(str[i] > str[j])
 9                 ++count;
10     return count;
11 }

2. 歸并排序&分治思想
其實,只要將歸并排序稍加修改,就是一個求解逆序?qū)€數(shù)問題的O(nlgn)方法
要理解的是這其中涉及的分治思想(三步驟):
a. 分解為子問題
b. 求解子問題
c. 合并子問題的解來得到原問題的解
具體對應(yīng)到求逆序?qū)€數(shù)的問題:
a. 將原數(shù)組分解為前后兩個子數(shù)組
b. 求解子數(shù)組的逆序?qū)€數(shù)
c. 合并前后子數(shù)組,同時計算逆序?qū)€數(shù)(這個是指逆序?qū)Φ牡谝粋€數(shù)在前子數(shù)組中,而第二個數(shù)在后子數(shù)組中)

 1 long long
 2 merge_count(long *arr, long *temp, long begin, long end)
 3 {
 4     if(begin >= end)
 5         return 0;
 6     long i, j, k, mid = (begin+end)/2;
 7     long long rt = 0;
 8     rt += merge_count(arr, temp, begin, mid);
 9     rt += merge_count(arr, temp, mid+1, end);
10     i = k = begin;
11     j = mid+1;
12     while(i<=mid && j<=end) {
13         if(arr[i] <= arr[j])
14             temp[k++= arr[i++];
15         else {
16             temp[k++= arr[j++];
17             rt += (mid-i+1);
18         }
19     }
20     for( ; i<=mid; i++)
21         temp[k++= arr[i];
22     for( ; j<=end; j++) {
23         temp[k++= arr[j];
24         rt += (mid-i+1);
25     }
26     /* copy */
27     for(k=begin; k<=end; k++)
28         arr[k] = temp[k];
29     return rt;
30 }

3. 特例方法
針對PKU 1007該題的特殊性: 字符串中只包含A, G, T, C四個字母,還有一種更加簡單的O(n)方法

 1 int 
 2 inversion_cal2(char *str)
 3 {
 4     int i, temp[4], count = 0;
 5     int len = strlen(str);
 6     memset(temp, 0sizeof(temp));
 7     for(i=len-1; i>=0; i--) {
 8         switch(str[i]) {
 9             case 'A':
10                 ++temp[0];
11                 break;
12             case 'C':
13                 ++temp[1];
14                 count += temp[0];
15                 break;
16             case 'G':
17                 ++temp[2];
18                 count += (temp[0]+temp[1]);
19                 break;
20             case 'T':
21                 ++temp[3];
22                 count += (temp[0]+temp[1]+temp[2]);
23                 break;
24         }
25     }
26     return count;
27 }



simplyzhao 2010-07-04 10:07 發(fā)表評論
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            蜜臀av性久久久久蜜臀aⅴ| 久久综合中文字幕| 一本色道久久综合一区| 欧美日韩视频在线第一区| 亚洲一区二区不卡免费| 一区二区三区四区在线| 国产精品国产三级国产普通话三级| 在线亚洲欧美| 亚洲综合三区| 国外视频精品毛片| 免费成人av资源网| 欧美顶级艳妇交换群宴| 亚洲在线免费视频| 欧美在线看片| 亚洲另类一区二区| 亚洲欧美一区在线| 亚洲成在人线av| 99国产精品久久久久老师| 国产嫩草影院久久久久| 欧美国产一区二区| 欧美性开放视频| 蜜桃av噜噜一区| 欧美三级中文字幕在线观看| 先锋影音国产精品| 欧美不卡在线视频| 欧美一级片久久久久久久| 另类专区欧美制服同性| 一区二区欧美国产| 久久都是精品| 亚洲一区二区动漫| 狂野欧美一区| 欧美一级视频精品观看| 欧美成人综合网站| 久久成人免费电影| 欧美女人交a| 欧美成年人视频网站| 国产精品久久久免费| 亚洲高清视频一区二区| 国产精品任我爽爆在线播放| 欧美福利视频网站| 国产丝袜一区二区三区| 99国产精品视频免费观看一公开 | 亚洲精品资源| 国语自产偷拍精品视频偷| 日韩视频中午一区| 亚洲国产人成综合网站| 欧美一区二区视频在线观看2020| 一本久久青青| 欧美国产日韩精品| 欧美电影在线观看完整版| 国产欧美91| 中国女人久久久| 亚洲乱码视频| 欧美大片专区| 亚洲国产高清一区| 亚洲国产成人av| 欧美中在线观看| 久久精品人人做人人综合| 国产精品人人做人人爽| 亚洲午夜羞羞片| 亚洲无毛电影| 欧美性理论片在线观看片免费| 91久久综合| 99日韩精品| 欧美日韩中国免费专区在线看| 亚洲黄色成人久久久| 亚洲电影免费观看高清完整版在线观看 | 国产精品女同互慰在线看| 亚洲国产一区二区在线| 91久久久在线| 毛片基地黄久久久久久天堂| 麻豆精品国产91久久久久久| 国产一区二区丝袜高跟鞋图片| 亚洲一区二区三区涩| 亚洲影院免费观看| 国产精品欧美日韩一区| 亚洲夜晚福利在线观看| 欧美一区影院| 精品999日本| 美女爽到呻吟久久久久| 91久久精品国产91久久| 亚洲少妇中出一区| 国产精品久久久久久久久久免费 | 欧美一级二区| 国产真实乱偷精品视频免| 欧美综合二区| 欧美国产乱视频| 一区二区三区成人精品| 国产精品美女久久久免费| 亚洲欧美在线一区| 免费久久久一本精品久久区| 亚洲欧洲精品一区二区三区波多野1战4 | 美女精品自拍一二三四| 亚洲九九爱视频| 欧美午夜电影在线| 久久精品国产成人| 亚洲国产欧美不卡在线观看 | 国产一区二区三区不卡在线观看| 久久精品国产亚洲高清剧情介绍| 欧美成人精品在线| 亚洲直播在线一区| 揄拍成人国产精品视频| 欧美日韩精品一区二区三区| 新狼窝色av性久久久久久| 亚洲电影欧美电影有声小说| 亚洲男人的天堂在线| 亚洲国产老妈| 国产伦精品一区二区| 免费观看成人www动漫视频| 在线一区二区三区做爰视频网站 | 亚洲影院在线观看| 亚洲第一区在线观看| 欧美色综合网| 老司机午夜免费精品视频 | 久久久久久噜噜噜久久久精品| 91久久国产综合久久| 国产三级欧美三级| 欧美日韩黄色一区二区| 久久综合狠狠综合久久激情| 亚洲一区二区三区四区视频| 亚洲黄色天堂| 裸体丰满少妇做受久久99精品| 制服丝袜亚洲播放| 91久久精品国产91久久| 国产视频在线观看一区| 欧美午夜在线视频| 欧美激情网站在线观看| 久久精品视频在线| 欧美一级大片在线观看| 在线综合亚洲| 亚洲精品美女久久久久| 欧美国产另类| 欧美国产欧美亚州国产日韩mv天天看完整| 香蕉av福利精品导航| 亚洲一区二区三区国产| 亚洲巨乳在线| 亚洲人体1000| 亚洲欧洲精品一区二区三区不卡| 在线播放一区| 亚洲国产成人久久| 亚洲国产日韩欧美一区二区三区| 海角社区69精品视频| 国产亚洲观看| 国内成人精品一区| 影音先锋另类| 亚洲电影激情视频网站| 136国产福利精品导航网址| 在线欧美不卡| 亚洲欧洲精品一区| 一区二区精品国产| 亚洲视频图片小说| 亚洲欧美一区二区三区极速播放| 9l国产精品久久久久麻豆| 一区二区三区免费在线观看| 日韩系列在线| 亚洲欧美成人一区二区三区| 欧美亚洲在线| 久久综合久久久久88| 欧美va天堂在线| 91久久国产综合久久91精品网站| 亚洲精品专区| 亚洲永久精品国产| 久久精品视频在线免费观看| 免费91麻豆精品国产自产在线观看| 欧美jizz19性欧美| 欧美日韩一级大片网址| 国产亚洲观看| 亚洲欧洲中文日韩久久av乱码| 在线视频一区观看| 欧美一区二区国产| 欧美福利视频在线| 亚洲视频网站在线观看| 欧美在线网址| 欧美日本精品| 国产一区二区福利| 日韩午夜电影| 欧美自拍偷拍| 亚洲国产成人在线视频| 亚洲午夜久久久久久久久电影院 | 国产在线拍偷自揄拍精品| 亚洲第一精品影视| 亚洲一二三区在线观看| 久久综合久久久| 一片黄亚洲嫩模| 麻豆精品视频在线| 欧美色视频在线| 亚洲国产精品va在线观看黑人| 国产精品99久久久久久白浆小说| 久久久久久久久久久成人| 99国内精品久久久久久久软件| 亚洲一区二区三区在线视频| 欧美成人精品一区二区三区| 国产色婷婷国产综合在线理论片a| 亚洲国产天堂久久国产91| 欧美一区激情视频在线观看| 亚洲精品乱码久久久久久蜜桃91 | 欧美在线看片a免费观看| 欧美激情影音先锋| 国产欧美日韩一区| 亚洲一级一区|