• <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
            調(diào)試了將近一個小時!我美好的一個夜晚??!就這樣浪費了!
            而不斷WA的原因竟然是因為輸出格式問題!最后一組數(shù)據(jù)后面多了一個回車!
            再次抱怨ACM的多組數(shù)據(jù)測試!抱怨全文比較!抱怨不提示PE提示W(wǎng)A!
            好了,STOP!
            這題BFS求最短路即可。雖然可能有25000個單詞,相當于25000個結(jié)點,構圖的話空間肯定不夠,時間也不允許。但是因為單詞長度不同的肯定不會是doublet,所以平均下來一個圖的結(jié)點數(shù)大約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 閱讀(1145) 評論(3)  編輯 收藏 引用 所屬分類: 題目分類:圖論

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

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

            還有5天就是NOIP2010了,我必須得準備啊~我確實很久沒有寫程序了。  回復  更多評論
              
            国产精品久久精品| 久久国产精品二国产精品| 国产成人精品久久亚洲高清不卡 | 狠狠色狠狠色综合久久| 久久精品国产精品亚洲艾草网美妙| 99久久免费国产特黄| 亚洲国产精品成人久久| 99精品国产99久久久久久97| 一本久久免费视频| 99久久香蕉国产线看观香| 日本久久久久久久久久| 人妻无码精品久久亚瑟影视| 欧美精品丝袜久久久中文字幕 | 97精品国产97久久久久久免费| 久久国产精品无码HDAV| 亚洲人成伊人成综合网久久久| 伊人久久大香线蕉精品不卡| 一本久久a久久精品综合香蕉| 久久久久久精品免费看SSS| 狠狠色综合网站久久久久久久高清| 青青草原精品99久久精品66| 69SEX久久精品国产麻豆| 99久久婷婷国产一区二区| 精品久久久久久亚洲| 久久99精品久久久久久9蜜桃| 久久精品国产亚洲7777| 欧美伊人久久大香线蕉综合| 久久无码人妻一区二区三区| 国产ww久久久久久久久久| 久久亚洲精品国产精品婷婷| 亚洲AV无码久久寂寞少妇| 久久久青草久久久青草| 综合久久精品色| 久久国产精品-国产精品| 久久久久噜噜噜亚洲熟女综合| 久久热这里只有精品在线观看| 久久96国产精品久久久| 久久综合视频网| 欧美一区二区精品久久| 亚洲国产精品无码久久久不卡| 国产亚洲精午夜久久久久久|