• <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>
            心如止水
            Je n'ai pas le temps
            posts - 400,comments - 130,trackbacks - 0
            調試了將近一個小時!我美好的一個夜晚啊!就這樣浪費了!
            而不斷WA的原因竟然是因為輸出格式問題!最后一組數據后面多了一個回車!
            再次抱怨ACM的多組數據測試!抱怨全文比較!抱怨不提示PE提示WA!
            好了,STOP!
            這題BFS求最短路即可。雖然可能有25000個單詞,相當于25000個結點,構圖的話空間肯定不夠,時間也不允許。但是因為單詞長度不同的肯定不會是doublet,所以平均下來一個圖的結點數大約25000/16個,O(n^2)的算法足夠了。
            在讀入是就把不同長度的單詞分開,BFS讓字符串進隊列,只需要讓該字符串所在位置編號入隊即可。
            以下是我的代碼:
            #include<iostream>
            #include
            <fstream>
            #include
            <string>
            #include
            <bitset>
            #include
            <stdio.h>
            #include
            <stdlib.h>
            #include
            <string.h>
            #define maxl 17
            #define maxn 25147
            using namespace std;

            typedef 
            struct
            {
                
            long counter,front,rear,pos[maxn];
            }queue;
            void Clear(queue &q)
            {
                q.counter
            =0;q.front=0;q.rear=-1;
            }
            bool Empty(queue &q)
            {
                
            return (q.counter==0);
            }
            void Push(queue &q,long x)
            {
                q.counter
            ++;
                q.rear
            ++;
                q.pos[q.rear]
            =x;
            }
            void Pop(queue &q,long &x)
            {
                q.counter
            --;
                x
            =q.pos[q.front];
                q.front
            ++;
            }

            long T=0,cnt[maxl];
            string word[maxl][maxn];
            queue q;

            bool doublet(string &a,string &b)
            {
                
            long l=a.length(),diff=0;
                
            for(long i=0;i<l;i++)
                  
            if(a[i]!=b[i])
                  {
                     diff
            ++;
                     
            if(diff>=2return false;
                  }
                
            if(!diff) return false;
                
            return true;
            }

            int main()
            {
                memset(cnt,
            0,sizeof(cnt));
                
                
            string t;
                
            while(getline(cin,t)&&!t.empty())
                {
                   cnt[t.length()]
            ++;
                   word[t.length()][cnt[t.length()]]
            =t;
                }
                
            string a,b;
                
            while(cin>>a>>b)
                {
                   T
            ++;
                   
            long la=a.length(),pa,lb=b.length(),pb;
                   
            long d[maxn],f[maxn];
                   
            bool used[maxn];
                   
                   
            if(la!=lb)
                   {
                      
            if(T>=2) cout<<endl;
                      cout
            <<"No solution."<<endl;
                      
            continue;
                   }
                   
                   
            for(pa=1;pa<=cnt[la];pa++)
                     
            if(word[la][pa]==a)
                       
            break;
                   
            for(pb=1;pb<=cnt[la];pb++)
                     
            if(word[la][pb]==b)
                       
            break;
                   
            if(pa>cnt[la]||pb>cnt[la])
                   {
                      
            if(T>=2) cout<<endl;
                      cout
            <<"No solution."<<endl;
                      
            continue;
                   }
                   
                   memset(d,
            -1,sizeof(d));
                   memset(f,
            0,sizeof(f));
                   memset(used,
            false,sizeof(used));
                   Clear(q);
                   Push(q,pa);d[pa]
            =0;f[pa]=0;used[pa]=true;
                   
            while(!Empty(q))
                   {
                      
            long r;
                      Pop(q,r);
                      
            for(long i=1;i<=cnt[la];i++)
                        
            if(!used[i]&&doublet(word[la][r],word[la][i]))
                        {
                           Push(q,i);
                           d[i]
            =d[r]+1;
                           f[i]
            =r;
                           used[i]
            =true;
                        }
                      
            if(d[pb]!=-1break;
                   }
                   
            if(d[pb]==-1)
                   {
                      
            if(T>=2) cout<<endl;
                      cout
            <<"No solution."<<endl;
                   }
                   
            else
                   {
                      
            if(T>=2) cout<<endl;
                      
            long num=0,ans[maxn];
                      num
            ++;ans[num]=pb;
                      
            while(f[pb])
                      {
                         num
            ++;ans[num]=f[pb];
                         pb
            =f[pb];
                      }
                      
            for(long i=num;i>=1;i--)
                        cout
            <<word[la][ans[i]]<<endl;
                   }
                }
            return 0;
            }
            posted on 2010-11-15 00:02 lee1r 閱讀(1169) 評論(3)  編輯 收藏 引用 所屬分類: 題目分類:圖論

            FeedBack:
            # re: UVa 10150 Doublets
            2010-11-15 11:50 | Tanky Woo
            為何感覺你每次題目的代碼都很長呢?是題目太難了嗎?

            還以為你一直沒寫博客了,沒想到還在繼續寫。呵呵。  回復  更多評論
              
            # re: UVa 10150 Doublets
            2010-11-15 12:16 | Lee1R
            @Tanky Woo
            因為這題需要用隊列,隊列的函數都得寫。ACM當然可以直接#include<queue>,但是OI不允許這樣用啊,必須自己寫。而且ACM的題目很注重細節,需要把各種可能的情況全都考慮。再者這道題不僅要求最優值,還要求輸出最優解,就必須記錄路徑……程序就長了。

            還有5天就是NOIP2010了,我必須得準備啊~我確實很久沒有寫程序了。  回復  更多評論
              
            久久香蕉超碰97国产精品 | 亚洲美日韩Av中文字幕无码久久久妻妇| 久久丫精品国产亚洲av不卡 | 久久99精品国产麻豆不卡| 久久精品国产亚洲Aⅴ香蕉| 久久婷婷国产剧情内射白浆| 久久国产热精品波多野结衣AV| 久久国产午夜精品一区二区三区| 久久久亚洲AV波多野结衣| 亚洲狠狠久久综合一区77777 | 色欲久久久天天天综合网精品| 久久久婷婷五月亚洲97号色| 欧美久久久久久午夜精品| 色欲综合久久中文字幕网| 亚洲精品99久久久久中文字幕| 久久91精品国产91久久户| 无码人妻精品一区二区三区久久久| 国产精品热久久无码av| 久久久久高潮毛片免费全部播放| 久久99精品国产麻豆婷婷| 91视频国产91久久久| 少妇无套内谢久久久久| 久久久久久久久久久久久久| 国产免费久久精品丫丫| 日产精品99久久久久久| 精品一二三区久久aaa片| 久久影视综合亚洲| 久久综合综合久久97色| 一本色道久久99一综合| 亚洲伊人久久成综合人影院| 久久久久亚洲AV无码专区网站| 欧美一区二区精品久久| 久久精品www| 久久综合九色综合精品| 国产亚洲成人久久| 99久久精品无码一区二区毛片| 色综合久久最新中文字幕| 伊人色综合久久天天| 久久久久国产精品三级网| 久久久久无码国产精品不卡| 亚洲国产天堂久久综合|