• <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 閱讀(1158) 評論(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了,我必須得準備啊~我確實很久沒有寫程序了。  回復  更多評論
              
            亚洲va久久久噜噜噜久久男同| 999久久久国产精品| 综合久久给合久久狠狠狠97色| 久久久久亚洲av综合波多野结衣| 亚洲AV成人无码久久精品老人| 久久99精品国产| yy6080久久| 久久综合久久综合九色| 亚洲精品成人久久久| 久久精品中文字幕无码绿巨人| 久久播电影网| 精品久久人妻av中文字幕| 久久久久亚洲AV成人网| 浪潮AV色综合久久天堂| 一本一道久久a久久精品综合| 久久er热视频在这里精品| 久久这里都是精品| 久久久久人妻精品一区三寸蜜桃| 久久亚洲精品人成综合网| 奇米影视7777久久精品人人爽| 国产日产久久高清欧美一区| 亚洲va久久久噜噜噜久久| 久久人人爽人人爽人人片AV东京热 | 久久久久国产精品熟女影院| 欧美伊人久久大香线蕉综合69 | 亚洲国产精品一区二区久久| 亚洲国产精品无码久久SM| 青青草国产97免久久费观看| 精品无码久久久久久久久久| 亚洲国产成人久久综合一| 久久精品无码一区二区无码| 亚洲va久久久噜噜噜久久男同| 久久精品人人做人人爽电影| 久久精品无码一区二区WWW| 中文国产成人精品久久亚洲精品AⅤ无码精品| 国产AⅤ精品一区二区三区久久| 国产午夜久久影院| 国产精品久久久久乳精品爆 | 久久精品中文字幕久久| 久久国产精品99国产精| 精品久久8x国产免费观看|