• <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 閱讀(1145) 評論(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了,我必須得準備啊~我確實很久沒有寫程序了。  回復  更多評論
              
            久久er热视频在这里精品| 伊人久久大香线蕉综合Av| 国产精品美女久久久久AV福利| 一本一道久久精品综合| 精品视频久久久久| 久久精品一区二区三区AV| 九九精品99久久久香蕉| 精品99久久aaa一级毛片| 久久婷婷人人澡人人爽人人爱 | 久久久久免费精品国产| 精品久久久久久无码人妻热| 伊人久久一区二区三区无码| 久久精品中文字幕久久| 老男人久久青草av高清| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品9999久久久久| 色偷偷91久久综合噜噜噜噜| 久久精品国产亚洲av影院| 国产精品99久久不卡| 久久亚洲AV成人无码电影| 久久午夜综合久久| 亚洲国产二区三区久久| 天天躁日日躁狠狠久久| 久久人人爽人人爽人人片AV麻豆| 久久人人妻人人爽人人爽| 亚洲第一永久AV网站久久精品男人的天堂AV| 亚洲国产另类久久久精品黑人| 狠狠色综合久久久久尤物| 99久久这里只有精品| 精品综合久久久久久97| 天天综合久久一二三区| 久久久久久无码国产精品中文字幕| 精品国产一区二区三区久久| 香蕉久久av一区二区三区| 久久精品免费一区二区| 欧美精品九九99久久在观看| 久久成人小视频| 久久久久久久波多野结衣高潮| 婷婷久久综合九色综合九七| 亚洲?V乱码久久精品蜜桃 | 精品国产综合区久久久久久 |