• <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>
            算法學(xué)社
            記錄難忘的征途
            posts - 141,comments - 220,trackbacks - 0

            題目簡(jiǎn)介:

                給一個(gè)長(zhǎng)度為N(N<600,000)的序列,讓你按順序插入靜態(tài)二叉樹(shù)。然后DFS出一個(gè)序列,問(wèn)某個(gè)模式串在這個(gè)序列中出現(xiàn)了幾次?

            吐槽:

                被KMP卡了一個(gè)晚上是什么水平? 數(shù)組開(kāi)小了WA了一下午是什么水平?

            算法分析:

                比較難想的是如何實(shí)現(xiàn)這個(gè)靜態(tài)二叉樹(shù),因?yàn)橐粋€(gè)DFS序列,所以組織靜態(tài)二叉樹(shù)是不可逃避的了。
                這里用到一個(gè)結(jié)論,就是新插入的數(shù)的父親,要么是比它大的最小的那個(gè)元素,要么是比它小的最大的那個(gè)元素。
                然后套一個(gè)KMP就水過(guò)了。。。。
             1 #include<iostream>
             2 #include<cstdio>
             3 #include<cstring>
             4 #include<cassert>
             5 using namespace std;
             6 const int N = 600005;
             7 template <typename T> inline void chkmin(T &a,T b){if(a>b) a=b;}
             8 template <typename T> inline void chkmax(T &a,T b){if(a<b) a=b;}
             9 bool ch[N<<2];
            10 char parten[10000];
            11 int nxt[N],seg[N<<2][2], stk[N], vis[N], hash[N];
            12 const int inf = ~0u>>2;
            13 struct tree{
            14     int l,r,v;
            15     tree(){}
            16     tree(int _l,int _r,int _v) : l(_l), r(_r), v(_v) {}
            17 } num[N];
            18 int n,len;
            19 int main(){
            20     int test,M;
            21     cin >> test;
            22     for(int _=1;_<=test;_++){
            23         cin >> n;
            24         int v,val;
            25         for(int i=30;i>=0;i--) if((1<<i)>=n) M = 1<<i;
            26         for(int i=0;i<2*M;i++) seg[i][1] = -1, seg[i][0] = inf;
            27         for(int i=0;i<n;i++){
            28             scanf("%d",&v);
            29             val = v;
            30             hash[val] = i;
            31             if(i==0) {
            32                 num[0] = tree(-1,-1,v); 
            33                 v += M-1;
            34                 while(v){seg[v][0] = seg[v][1] = val;v>>=1;}
            35                 continue;
            36             }
            37             num[i] = tree(-1,-1,v);
            38             int mn = -1, mx = inf;
            39             for(v += M-1; v; v>>=1){
            40                 chkmin(seg[v][0],val);
            41                 chkmax(seg[v][1],val);
            42                 if(v&1) chkmax(mn,seg[v^1][1]);
            43                 else chkmin(mx, seg[v^1][0]);
            44             }
            45             //cout<<val<<" "<<mn<<" "<<mx<<endl;
            46             if(mn == -1 || num[hash[mn]].r !=-1){
            47                 num[hash[mx]].l = i;
            48             } else num[hash[mn]].r = i;
            49         }
            50         len = 0;
            51         
            52         for(int i=0;i<n;i++) vis[i] = 0;
            53         int tp = 0,u;stk[0] =0;
            54         while(!vis[0]) {
            55             u = stk[tp];
            56             ch[len++] = num[u].v & 1;
            57             v = num[u].l;
            58             if(v!=-1 && !vis[v]) {stk[++tp] = v; continue;}
            59             v = num[u].r;
            60             if(v!=-1 && !vis[v]) {stk[++tp] = v; continue;}
            61             tp--;
            62             vis[u] = 1;
            63         }
            64 //        for(int i=0;i<len;i++) cout<<ch[i]<<" ";cout<<endl;
            65         
            66         scanf("%s",parten);
            67         nxt[0] = -1; int m = strlen(parten);
            68         int j = -1;
            69         for(int i=0;i<m;i++) parten[i] -='0';
            70         for(int i=1;i<m;i++){
            71             while(j>=0 && parten[i]!=parten[j+1])    
            72                 j=nxt[j];
            73             if(parten[i]==parten[j+1]) j++; 
            74             nxt[i] = j;
            75         }
            76 //        for(int i=0;i<m;i++) cout<<nxt[i]<<" "; cout<<endl;
            77         int ans = 0; j = -1;
            78         for(int i=0;i<len;i++){
            79 //            cout<<j<<" ";
            80             while(j>=0 && parten[j+1]!=ch[i]) j = nxt[j]; 
            81             if(parten[j+1]==ch[i]) 
            82                 j++;
            83             if(j == m-1) {
            84                 ans++;
            85                 j = nxt[j];
            86             }
            87         }
            88         printf("Case #%d: %d\n",_,ans);
            89     }
            90 }
            91 
            posted on 2012-07-02 15:14 西月弦 閱讀(609) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久国产成人午夜aⅴ影院| 亚洲国产成人久久综合野外| 久久性精品| 久久精品国产清自在天天线| …久久精品99久久香蕉国产| 久久亚洲精品成人av无码网站| 久久久久久久97| 伊人久久精品无码二区麻豆| 日韩欧美亚洲综合久久| 国产成人精品综合久久久| 亚洲综合久久久| 久久精品国产2020| 午夜天堂av天堂久久久| 久久久噜噜噜久久中文福利| 久久久久人妻精品一区二区三区| 久久一日本道色综合久久| 国产精品久久久久AV福利动漫| 国产精品久久久久影视不卡| 国产激情久久久久影院小草| 亚洲欧美国产日韩综合久久| 欧美日韩精品久久久久| 99久久久精品| 久久久久国产| 久久久无码一区二区三区| 狠狠精品干练久久久无码中文字幕| 久久99精品久久久久久不卡| 无码八A片人妻少妇久久| 国产91色综合久久免费| 老司机午夜网站国内精品久久久久久久久 | 久久精品成人欧美大片| 久久婷婷五月综合国产尤物app| 久久久青草久久久青草| 欧美大战日韩91综合一区婷婷久久青草 | 亚洲欧洲精品成人久久奇米网| 色偷偷偷久久伊人大杳蕉| 成人精品一区二区久久| 欧美精品一区二区久久| 99久久精品国内| 国内精品久久久久影院薰衣草 | 久久精品国产亚洲AV无码偷窥| 久久精品无码av|