• <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>

            bon

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              46 Posts :: 0 Stories :: 12 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(2)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            poj 3349

            本來不想看discuss了,不過因為這道題拖太久了,所以還是看了一下^_^,不過算法還是自己想的。
            之前程序已經做好了,但一直WA,估計不是算法的錯,而是程序的錯。

            這道題給了兩個啟示:
            1. 點的哈希函數:我是把坐標值(六個整數值)求和模149997,哈希表長度是150000。嚴蔚敏的《數據結構》指出:模的數可以選為質數或不包
                含小于20的質因數的合數。另外這個數要盡量接近哈希表長度,這樣才能有效利用哈希表的空間,而不會使得數據集中在前面。

            2. 有大量輸入時(100000×6個整數),每個整數最長有7位,這時用getchar()輸入字符再轉成整數會比scanf()輸入整數快很多!(2438ms VS 610ms)

            3. 這道題的數據可以是這樣:1 2 3 1 5 6 與 1 5 6 1 2 3是同一朵雪花,但我之前的程序沒有判斷出來。具體看下面程序里的equal函數。

              1 #include <iostream>
              2 #include <set>
              3 
              4 using namespace std;
              5 
              6 const int maxn=150000;
              7 struct node{
              8     node(){idx=-1;next=NULL;}
              9     node(int id){idx=id;next=NULL;}
             10     int idx;
             11     node *next;
             12 }table[maxn];
             13 
             14 int a[100010][6];
             15 int n;
             16 int hash(int *a)
             17 {
             18     //a[6]=0;
             19     __int64 sum=0;
             20     for(int i=0;i<6;i++) sum+=a[i];//*a[i]);
             21     return sum%149997;
             22 }
             23 
             24 void init()
             25 {
             26     for(int i=0;i<n;i++){
             27         table[i].idx=-1;
             28         table[i].next=NULL;
             29     }
             30 }
             31 
             32 bool equal(int i,int j)
             33 {
             34     //if(a[i][6]!=a[j][6]) return false;
             35     int x,yy=0,y;
             36     int flag=0;
             37     while(yy<6){
             38         while(yy<6 && a[j][yy]!=a[i][0]) yy++;
             39         if(yy==6return false;
             40         y=yy;
             41         for(x=0;x<6;x++){
             42             if(a[i][x]==a[j][y]){
             43                 y++;
             44                 if(y==6) y=0;
             45             }
             46             else break;
             47         }
             48         if(x==6return true;
             49         y=yy;
             50         for(x=0;x<6;x++){
             51             if(a[i][x]==a[j][y]){
             52                 y--;
             53                 if(y==-1) y=5;
             54             }
             55             else break;
             56         }
             57         if(x==6return true;
             58         yy++;
             59     }
             60     return false;
             61 }
             62 
             63 // 讀入字符并轉成整數
             64 void readNumber(int i)
             65 {
             66     char ch;
             67     //ch=getchar();
             68     ch=getchar();
             69     while(ch==' ') ch=getchar();
             70     int x=0;
             71     while(ch!=' ') {x*=10;x+=ch-'0';ch=getchar();}
             72     a[i][0]=x;
             73 
             74     ch=getchar();
             75     while(ch==' ') ch=getchar();
             76     x=0;
             77     while(ch!=' ') {x*=10;x+=ch-'0';ch=getchar();}
             78     a[i][1]=x;
             79 
             80     ch=getchar();
             81     while(ch==' ') ch=getchar();
             82     x=0;
             83     while(ch!=' ') {x*=10;x+=ch-'0';ch=getchar();}
             84     a[i][2]=x;
             85 
             86     ch=getchar();
             87     while(ch==' ') ch=getchar();
             88     x=0;
             89     while(ch!=' ') {x*=10;x+=ch-'0';ch=getchar();}
             90     a[i][3]=x;
             91 
             92     ch=getchar();
             93     while(ch==' ') ch=getchar();
             94     x=0;
             95     while(ch!=' ') {x*=10;x+=ch-'0';ch=getchar();}
             96     a[i][4]=x;
             97 
             98     ch=getchar();
             99     while(ch==' ') ch=getchar();
            100     x=0;
            101     while(ch!=10 && ch!=' ')
            102     {
            103         x*=10;
            104         x+=ch-'0';
            105         ch=getchar();
            106     }
            107     a[i][5]=x;
            108     if(ch==' '){
            109         ch=getchar();
            110         while(ch!=10) ch=getchar();
            111     }
            112 }
            113 
            114 bool solve()
            115 {
            116     scanf("%d",&n);
            117     getchar();
            118     //init();
            119     int i,flag=0;
            120     node *tmp,*tmp2;
            121     for(i=0;i<&& !flag;i++){
            122         //scanf("%d%d%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3],&a[i][4],&a[i][5]);
            123         readNumber(i);
            124         int code=hash(a[i]);
            125         if(table[code].idx==-1){
            126             table[code].idx=i;
            127         }else{
            128             //flag=0;
            129             tmp2=NULL;
            130             tmp=&(table[code]);
            131             while(tmp!=NULL){
            132                 if(equal(i,tmp->idx)) {flag=1;break;}
            133                 tmp2=tmp;
            134                 tmp=tmp->next;
            135             }
            136             if(!flag) tmp2->next=new node(i);
            137         }
            138     }
            139     //printf("%d\n",i);
            140     /*
            141     int aa,bb,cc,xx,yy,zz;
            142     
            143     if(i<n){
            144         for(;i<n;i++) scanf("%d%d%d%d%d%d",&aa,&bb,&cc,&xx,&yy,&zz);
            145     }
            146     */
            147     if(flag) return true;
            148     return false;
            149 }
            150 
            151 int main()
            152 {
            153     //freopen("in.txt","r",stdin);
            154     if(solve()) printf("Twin snowflakes found.\n");
            155     else printf("No two snowflakes are alike.\n");
            156     return 1;
            157 }
            158 
            159 
            160 

            posted on 2008-05-24 11:34 bon 閱讀(1085) 評論(1)  編輯 收藏 引用 所屬分類: Programming Contest

            Feedback

            # re: pku 3349 2009-06-24 17:07 sum
            大哥超時 勒  回復  更多評論
              

            Google PageRank 
Checker - Page Rank Calculator
            亚洲乱亚洲乱淫久久| 久久久无码一区二区三区| 久久久久人妻精品一区 | 精品国产乱码久久久久久呢 | 亚洲AV无码久久精品蜜桃| 国产L精品国产亚洲区久久| 久久精品国产免费一区| 国产精品久久久久久吹潮| 中文字幕人妻色偷偷久久 | 国产精品99久久99久久久| 97久久精品国产精品青草| 99久久99久久精品免费看蜜桃| 久久国产色AV免费看| 99国产精品久久| 成人a毛片久久免费播放| 91精品婷婷国产综合久久| 亚洲国产精久久久久久久| 国产午夜电影久久| 一本一道久久a久久精品综合| 久久久久久曰本AV免费免费| 久久天天躁狠狠躁夜夜躁2O2O| 狠狠色噜噜狠狠狠狠狠色综合久久 | 伊人久久大香线蕉av一区| 丁香狠狠色婷婷久久综合| 久久www免费人成精品香蕉| 久久久久久无码Av成人影院| 午夜精品久久久久久| 99久久精品无码一区二区毛片| 人妻精品久久久久中文字幕| 久久久久国产一级毛片高清版| 亚洲欧美国产日韩综合久久| 伊人色综合久久| 999久久久免费精品国产| 国产亚洲美女精品久久久2020| 99热成人精品免费久久| 国产精品禁18久久久夂久| 2021久久精品国产99国产精品| 久久综合给久久狠狠97色| 精品无码久久久久国产动漫3d| 亚洲国产成人乱码精品女人久久久不卡| 成人综合伊人五月婷久久|