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

            題目簡介:

                給一個長度為N(N<600,000)的序列,讓你按順序插入靜態二叉樹。然后DFS出一個序列,問某個模式串在這個序列中出現了幾次?

            吐槽:

                被KMP卡了一個晚上是什么水平? 數組開小了WA了一下午是什么水平?

            算法分析:

                比較難想的是如何實現這個靜態二叉樹,因為要一個DFS序列,所以組織靜態二叉樹是不可逃避的了。
                這里用到一個結論,就是新插入的數的父親,要么是比它大的最小的那個元素,要么是比它小的最大的那個元素。
                然后套一個KMP就水過了。。。。
             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 西月弦 閱讀(612) 評論(0)  編輯 收藏 引用
            国产精品视频久久久| 欧美激情精品久久久久久久九九九 | 91精品国产综合久久香蕉| 国产精品狼人久久久久影院| 久久精品成人免费网站| 亚洲国产高清精品线久久| 久久成人国产精品| 99久久99久久精品国产片| 久久久黄色大片| 99久久精品免费| 无码人妻精品一区二区三区久久| 中文精品久久久久国产网址| 2021国产精品午夜久久| 国产成人久久久精品二区三区| 欧美性猛交xxxx免费看久久久 | 一级做a爱片久久毛片| 久久久久久久久久久久久久| 97精品伊人久久久大香线蕉 | 久久天天躁狠狠躁夜夜躁2014| 久久96国产精品久久久| 日韩精品无码久久久久久| 亚洲?V乱码久久精品蜜桃| 日本免费一区二区久久人人澡 | 久久成人国产精品二三区| 超级97碰碰碰碰久久久久最新| 伊人久久精品线影院| 成人久久综合网| 久久人妻无码中文字幕| 久久精品无码专区免费| 99久久国产主播综合精品| av午夜福利一片免费看久久| 伊人色综合久久天天人手人婷| 久久伊人中文无码| 武侠古典久久婷婷狼人伊人| 亚洲国产成人久久精品99 | 久久久久免费看成人影片| 久久AV无码精品人妻糸列| 日韩影院久久| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 亚洲国产精品久久久久久| jizzjizz国产精品久久|