国产日产亚洲精品系列,国产在线观看精品一区二区三区,亚洲尤物视频网http://www.shnenglu.com/Joe/category/14148.html堅(jiān)信:勤能補(bǔ)拙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ā)揮到了極致啊呵呵,排序來(lái)排序去就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ā)表評(píng)論
]]>
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

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

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

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

代碼(快排)
 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 }

代碼(動(dòng)態(tài)分配節(jié)點(diǎn)的BST,原本想實(shí)現(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é)點(diǎn)的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ā)表評(píng)論
]]>
[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)用于對(duì)指針數(shù)組與二維數(shù)組排序時(shí),傳遞給compare函數(shù)的參數(shù)類型是不同的

首先,我們舉個(gè)簡(jiǎn)單的例子,先將qsort對(duì)整數(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 }
排序針對(duì)的是數(shù)組里的元素而言的,這里整數(shù)數(shù)組的元素就是整數(shù),因此qsort的第三個(gè)參數(shù)就是sizeof(int),而傳遞給比較函數(shù)cmp的參數(shù)就是相對(duì)應(yīng)的指向整數(shù)的指針

接著,我們來(lái)看看指針數(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ù)數(shù)組差不多,關(guān)鍵是抓住數(shù)組里元素的類型,既然稱之為指針數(shù)組,那數(shù)組元素的類型自然就是指針,因此qsort的第三個(gè)參數(shù)就是sizeof(char *),而傳遞給比較函數(shù)cmp的參數(shù)就是相對(duì)應(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都能正常的工作(*^__^*) 嘻嘻……
還是按照上述方法來(lái)分析,抓住數(shù)組元素的類型來(lái)入手,二維數(shù)組實(shí)際上就是數(shù)組的數(shù)組,因此二維數(shù)組的元素類型就是一維數(shù)組,因此qsort的第三個(gè)參數(shù)就是sizeof(str1[0])或sizeof(str2[0]),那傳遞給比較函數(shù)的參數(shù)應(yīng)該就是指向數(shù)組的指針,這點(diǎn)可以通過(guò)gdb設(shè)置斷點(diǎn)來(lái)得到證實(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"
通過(guò)第2行與第9行的比較可以發(fā)現(xiàn),比較函數(shù)的參數(shù)arg1其實(shí)就是&str1[0],類型為char (*)[],這也是為什么cmp1能正常工作的原因
那么cmp2呢,它為什么正確呢?
在cmp1中:strcmp((*((char (*)[])arg1)), (*((char (*)[])arg2))); 這里傳遞給strcmp的參數(shù)之所以不會(huì)出錯(cuò),是因?yàn)槲覀儗rg1解地址操作獲得一個(gè)數(shù)組,而數(shù)組名其實(shí)是指向數(shù)組首元素的指針,arg1既然是指向str1[0]這個(gè)一維數(shù)組的指針,而str1[0]本身其實(shí)就是指向這個(gè)一維數(shù)組的指針,也就是說(shuō)arg1其實(shí)就是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"

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

simplyzhao 2010-10-29 15:09 發(fā)表評(píng)論
]]>
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升序排列,然后對(duì)于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ā)表評(píng)論
]]>
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

思路:
按照坐標(biāo)從上到下、從左到右排序
首先想到的是O(n^2)的算法,時(shí)間需要1600+MS
然后,發(fā)現(xiàn)其實(shí)在排序之后只要從后向前掃描一遍即可得出結(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ā)表評(píng)論
]]>
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個(gè)順序統(tǒng)計(jì)量(詳見CLRS)
   利用快速排序過(guò)程中的思路,期望時(shí)間復(fù)雜度是O(n)

   ps: partition函數(shù)的執(zhí)行過(guò)程是比較有意思的呵呵
 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ā)表評(píng)論
]]>
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問(wèn)題:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1007
http://acm.pku.edu.cn/JudgeOnline/problem?id=2299

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

1. 最簡(jiǎn)單的方法
兩層循環(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. 歸并排序&分治思想
其實(shí),只要將歸并排序稍加修改,就是一個(gè)求解逆序?qū)€(gè)數(shù)問(wèn)題的O(nlgn)方法
要理解的是這其中涉及的分治思想(三步驟):
a. 分解為子問(wèn)題
b. 求解子問(wèn)題
c. 合并子問(wèn)題的解來(lái)得到原問(wèn)題的解
具體對(duì)應(yīng)到求逆序?qū)€(gè)數(shù)的問(wèn)題:
a. 將原數(shù)組分解為前后兩個(gè)子數(shù)組
b. 求解子數(shù)組的逆序?qū)€(gè)數(shù)
c. 合并前后子數(shù)組,同時(shí)計(jì)算逆序?qū)€(gè)數(shù)(這個(gè)是指逆序?qū)Φ牡谝粋€(gè)數(shù)在前子數(shù)組中,而第二個(gè)數(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. 特例方法
針對(duì)PKU 1007該題的特殊性: 字符串中只包含A, G, T, C四個(gè)字母,還有一種更加簡(jiǎn)單的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ā)表評(píng)論
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品一区二区久久久| 国产亚洲精品自拍| 美女久久一区| 亚洲第一色中文字幕| 免费一级欧美片在线播放| 亚洲福利在线视频| 日韩视频一区二区三区在线播放免费观看 | 国产视频精品xxxx| 欧美暴力喷水在线| 亚洲精品一区二区三区av| 欧美日韩精品一二三区| 先锋亚洲精品| 久久久久久综合网天天| 亚洲看片免费| 欧美激情第五页| 亚洲伊人一本大道中文字幕| 久久蜜桃精品| 亚洲欧洲精品一区二区| 亚洲一区二区三区久久 | 国产欧美精品一区二区色综合| 久久精品国产综合精品| 欧美一区二区| 日韩写真在线| **性色生活片久久毛片| 欧美日韩一区二区视频在线| 久久不射电影网| 欧美日韩高清在线观看| 国产亚洲一级高清| 中文日韩在线| 欧美高清视频在线播放| 亚洲综合精品自拍| 欧美不卡福利| 韩国精品久久久999| 一二三区精品| 欧美成人午夜77777| 亚洲欧美在线一区| 欧美日韩精品一区二区| 影音先锋久久资源网| 亚洲欧美久久久| 亚洲国产一区二区三区在线播| 性色一区二区| 国产精品大片| 制服诱惑一区二区| 亚洲经典一区| 另类国产ts人妖高潮视频| 亚洲精品一区二区三区四区高清| 久久国产直播| 国产精品影片在线观看| 一二三区精品福利视频| 欧美福利一区二区三区| 久久九九有精品国产23| 国产欧美一区二区色老头| 亚洲深夜影院| 亚洲人永久免费| 欧美mv日韩mv亚洲| 亚洲国产成人在线视频| 久久嫩草精品久久久久| 亚洲欧美变态国产另类| 欧美午夜剧场| 亚洲欧美日韩系列| 亚洲高清视频一区二区| 久热综合在线亚洲精品| 欧美美女视频| 影院欧美亚洲| 久久青青草综合| 亚洲欧美日韩综合| 老司机午夜精品视频在线观看| 亚洲欧洲一区| 久久国产精品一区二区三区四区| 国产欧美一区二区精品性色| 亚洲免费观看高清在线观看 | 欧美jjzz| 国产精品99久久久久久久女警| 午夜精品免费| 免费观看久久久4p| 亚洲性xxxx| 欧美主播一区二区三区| 黄色成人在线观看| 欧美本精品男人aⅴ天堂| 一本大道久久a久久综合婷婷| 亚洲视频每日更新| 一区二区三区四区国产| 久久亚洲视频| 性18欧美另类| 国产一区日韩一区| 在线亚洲观看| 欧美一级久久久久久久大片| 亚洲一区二区三区影院| 欧美激情成人在线视频| 91久久精品美女高潮| 午夜视频在线观看一区二区三区| 亚洲天堂免费观看| 亚洲欧美制服另类日韩| 日韩视频永久免费| 欧美电影在线| 韩日欧美一区二区| 亚洲第一视频网站| 久久久久国产精品厨房| 欧美高清日韩| 99精品欧美| 亚洲综合大片69999| 国产精品亚洲综合天堂夜夜| 亚洲激情在线视频| 国产欧美日韩麻豆91| 久久性天堂网| 国产精品一区久久久久| 一区二区三区视频在线| 午夜精品国产精品大乳美女| 国产精品自拍一区| 午夜精品国产更新| 久久视频在线视频| 亚洲精品乱码久久久久久蜜桃91 | 亚洲精品自在久久| 亚洲一级片在线观看| 欧美日一区二区在线观看 | 欧美综合国产| 欧美性色综合| 欧美日韩午夜在线| 午夜精品久久久久久99热软件| 久久精品综合网| 欧美日韩另类在线| 一二三区精品| 亚洲午夜精品久久久久久浪潮| 欧美成人在线网站| 欧美三级电影一区| 欧美黄色视屏| 狠狠干成人综合网| 一本色道久久| 91久久极品少妇xxxxⅹ软件| 欧美亚洲免费| 午夜精品影院在线观看| 欧美日韩不卡在线| 亚洲激情一区| 91久久久久久| 美女亚洲精品| 欧美成人按摩| 在线观看亚洲精品| 久久精品视频免费观看| 久久精品亚洲| 国产原创一区二区| 欧美一区二区三区在线视频| 欧美亚洲免费高清在线观看| 欧美特黄a级高清免费大片a级| 亚洲国产一区二区三区青草影视| 亚洲国产欧美一区二区三区久久 | 久久久免费av| 免费成人你懂的| 在线观看日韩www视频免费| 欧美中文字幕不卡| 久久婷婷麻豆| 在线观看国产成人av片| 久久久久久久综合日本| 欧美国产亚洲视频| 日韩午夜电影| 欧美激情视频一区二区三区免费 | 欧美电影免费观看大全| 亚洲国产日韩欧美在线动漫 | 久久精品中文字幕一区二区三区| 国产日韩欧美一二三区| 欧美在线视频一区| 久久婷婷av| 亚洲精品看片| 国产精品99一区| 午夜精品久久久久久久白皮肤 | 一个人看的www久久| 午夜精品久久一牛影视| 国产性天天综合网| 麻豆国产va免费精品高清在线| 欧美成人亚洲| 亚洲视频在线播放| 国产一区二区三区网站| 欧美777四色影视在线| 一本色道久久88综合亚洲精品ⅰ| 小嫩嫩精品导航| 精品91久久久久| 欧美日韩国产色综合一二三四| 亚洲一区二区三区成人在线视频精品| 欧美影院成年免费版| 亚洲激情网站| 国产精品稀缺呦系列在线| 欧美大片va欧美在线播放| 一区二区毛片| 韩国三级电影久久久久久| 欧美伦理视频网站| 性欧美办公室18xxxxhd| 亚洲高清网站| 久久av资源网站| 日韩视频国产视频| 精品av久久707| 国产精品成人aaaaa网站| 久久久免费av| 亚洲欧美日韩在线播放| 亚洲成人在线视频网站| 亚洲一区久久久| 亚洲欧洲一区二区在线播放| 国产精品日韩久久久| 欧美日本二区| 美女视频一区免费观看| 久久精品视频在线| 香蕉成人久久|