青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

算法學社
記錄難忘的征途
posts - 141,comments - 220,trackbacks - 0

題目描述:

    給N個串(N<100,000),總長不超過100,000。對于每個串,求至少在其他k個串中作為子串出現過的子串個數。

算法分析:

    
    不難想到在若干個串中,找滿足****性質的子串,可以用后綴數組求LCP解決。
    這里有一個性質,就是如果對于串S的后綴串Si,子串Sij滿足題目的性質,那么Sii...Sij都會滿足。
    這樣解的分部具有單調性,二分答案來求解。
    對于串LCPij,我們要找到含有LCPij的所有后綴串。用線段樹不難找到。
    設LCP(p...q)都含有Sij。下面我們的問題是,LCP(p...q)對應多少個原串。
    一開始我也蒙了,后來才知道根本不用求出對應多少個原串,只需知道是否大于等于k就可以了。
    我們掃一遍,預處理出LCP數組中對于r,最大的滿足LCP(l,r)對應k個原串的l。
    這題非常爽!! 又AK了一場,更爽!!!
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cassert>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
const int BS = 37;
const int N = 2* int(1e5) + 10;
char ch[N];
ull hash[N], base[N], ans[N];
int sa[N], lcp[N], pos[N] , n , k, P[N];
int seg[N<<2], M, len;
// suffix array
inline int cal(int a,int b,int c){
    if( a > b) swap(a,b);
    int l = 0;
    int r; if(c==0) r = len-b;
    else r = min(pos[P[a]+1]-a-1,pos[P[b]+1]-b-1);
    while(l<r){
        int mid = l+r >>1;
        if( hash[a] - hash[a + mid + 1] == (hash[b] - hash[b + mid + 1]) * base[b-a]) l = mid + 1; else r = mid;
    }
    return r;
}
bool cmp(int a,int b) {
    int l = cal(a,b,0);
    if(a + l == len) return 1;
    if(b + l == len) return 0;
    assert(ch[a+l] != ch[b+l]);
    return ch[a+l] < ch[b+l];
}
// queue
int flag[N],R[N],pa[N];
void init(){
    for(int i=0;i<len;i++){
        pa[i] = P[sa[i]];
        flag[i] = -1;
    }
    int cnt = 0,now = 0;
    for(int i=0;i<len;i++){
        if(flag[pa[i]] == -1){
            cnt ++;
        }
        flag[pa[i]] = i;
        if(cnt<k) R[i] = now;
        else if(cnt == k){
            while(flag[pa[now]]!= now) now++;
            R[i] = now;
        }
        else {
            flag[pa[now]] = -1;
            now ++;
            while(flag[pa[now]]!= now) now++;
            R[i] = now;
            cnt --;
        }
    }
}
// segment tree
int dfs(int p,int c,int v){
    if(p >= M) return p;
    if(c){
        if(seg[p<<1|1] < v)return dfs(p<<1|1,c,v);
        else return dfs(p<<1,c,v);
    }
    else {
        if(seg[p<<1] < v) return dfs(p<<1,c,v);
        else return dfs(p<<1|1,c,v);
    }
}
bool upt(int p,int v){
    if(v == 0) return N;
//    cout<<"upt: "<<p<<" "<<v<<" ";
    int r = -1, l = -1;
    if(seg[p+=M] < v) r = p;
    for(;p>1;p>>=1){
        if(p&1) if(l==-1) if(seg[p^1] < v) l = dfs(p^1,1,v);
        if(~p&1) if(r==-1) if(seg[p^1]< v) r = dfs(p^1,0,v);
    }
//    cout<<l-M<<" "<<r-M<<endl;
    l-=M, r-=M;
    return R[r] > l;
}
// debug
int OP(int p){while(ch[p]!='$') cout<<ch[p++];}
// main
int main(){
    base[0] = 1;
    for(int i=1;i<N;i++) base[i] = base[i-1] * BS;
    while(~scanf("%d%d",&n,&k)){
        pos[0] = 0;
        for(int i=0;i<n;i++){
            scanf("%s",ch + pos[i]);
            pos[i+1] = pos[i] + strlen(ch + pos[i]) + 1;
            ch[pos[i+1]-1] = '$';
        }
        len = pos[n];
        int nowp = 0;
        for(int i=0;i<len;i++) {P[i] = nowp; if(ch[i]=='$') nowp++;}
//        for(int i=0;i<len;i++) cout<<P[i]<<" "; cout<<endl;
        
// build lcp
        hash[len]  = 0;
        for(int i=len-1;i>=0; i--)
            hash[i] = hash[i+1]+ base[len-1-i] * (ch[i] == '$' ? 0 : ch[i] - 'a' + 1);
        for(int i=0;i<len;i++) sa[i] = i;
        stable_sort(sa, sa + len, cmp);
        for(int i=0;i<len-1;i++) lcp[i] = cal(sa[i],sa[i+1],1);
        lcp[len] = lcp[len-1] = 0;
        // build seg
        for(int i=30;i;i--) if((1<<i) > len) M = 1<<i;
        for(int i=M;i<M+M;i++) seg[i] = ~0u>>2;
        for(int i=0;i<=len;i++) seg[i+M] = lcp[i];
        for(int i=M-1;i;i--) seg[i] = min(seg[i<<1] , seg[i<<1|1]);
        init();
        memset(ans,0,sizeof(ans));
        for(int i = n; i < len; i++){
            int p = P[sa[i]];
            int l = 0, r = pos[p+1] - sa[i] ;
//            OP(sa[i]); cout<<" "<<l<<" "<<r<<endl;
            while(l<r) {
                int mid = l + r >> 1; 
                if( upt(i,mid)) l = mid +1;
                else r = mid;
            }
//            OP(sa[i]);cout<<" "<<lcp[i]<<" "<<r-1<<endl;
            ans[p] += r-1;
        }
        for(int i=0;i<n;i++)
            cout<<ans[i]<<" "; cout<<endl;
    }
}
posted on 2012-07-26 10:20 西月弦 閱讀(777) 評論(1)  編輯 收藏 引用 所屬分類: 解題報告

FeedBack:
# re: codeforces 204E 后綴數組+線段樹
2013-04-10 23:51 | acm愛好者
你好,不知可否此題在詳述一下?我想此題想了很久了。。一直沒懂怎么寫,能否發郵件交流?luyuncheng@sina.com  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲宅男天堂在线观看无病毒| 国产欧美日韩| 亚洲欧美一区二区激情| 一区二区三区国产精华| 一本久道综合久久精品| 亚洲一区自拍| 久久久天天操| 欧美精品一区二区三区蜜桃| 欧美精品电影在线| 国产精品v欧美精品v日韩 | 亚洲一二三四久久| 香蕉精品999视频一区二区| 久久xxxx| 欧美激情精品久久久| 国产精品久久久久久久久免费樱桃| 国产亚洲激情视频在线| 亚洲第一页在线| 在线视频亚洲欧美| 久久香蕉国产线看观看网| 亚洲国产综合91精品麻豆| 亚洲国产精品久久久久秋霞蜜臀| 亚洲视频网在线直播| 久久久蜜桃精品 | 在线成人小视频| 99精品欧美一区| 久久久亚洲综合| 99re66热这里只有精品3直播| 欧美一区二区视频观看视频| 欧美高清在线一区二区| 国产美女精品视频免费观看| 一区二区日韩伦理片| 欧美亚洲在线播放| 欧美区在线播放| 国内精品久久久久影院薰衣草| 一本久久综合亚洲鲁鲁| 久久伊人免费视频| 亚洲美女av网站| 久久aⅴ国产欧美74aaa| 国产精品成人一区| 亚洲国产日韩综合一区| 在线一区亚洲| 久久天天躁狠狠躁夜夜爽蜜月| 免费一级欧美在线大片| 国产精品一区二区在线观看| 韩日欧美一区| 性欧美1819sex性高清| 亚洲国产精品久久久久秋霞影院| 亚洲一区二区影院| 欧美色欧美亚洲另类二区| 亚洲夫妻自拍| 麻豆av一区二区三区| 欧美一区二区黄色| 国产女同一区二区| 性久久久久久久久| 亚洲你懂的在线视频| 欧美午夜免费影院| 亚洲一区二区黄色| 亚洲视频一起| 国产区精品视频| 久久久久久久波多野高潮日日 | 91久久精品一区二区三区| 久久久久网站| 久久久免费精品| 亚洲人精品午夜| 亚洲人成在线播放网站岛国| 欧美国产日韩一区| 9i看片成人免费高清| 91久久久亚洲精品| 欧美日韩一区二区视频在线 | 亚洲丰满少妇videoshd| 农村妇女精品| 欧美精品1区2区| 中文成人激情娱乐网| 亚洲视频在线免费观看| 国产精品推荐精品| 久久综合一区| 欧美精品91| 久久国产精品久久久久久久久久| 欧美亚洲在线视频| 1000部精品久久久久久久久| 亚洲国产天堂久久综合网| 欧美日韩午夜剧场| 欧美日韩精品高清| 亚洲精品久久久久中文字幕欢迎你 | 久久久亚洲国产天美传媒修理工 | 亚洲国产精品嫩草影院| 亚洲国产精品一区二区三区| 欧美日韩在线综合| 久久香蕉精品| 国产精品成人在线观看| aⅴ色国产欧美| 在线国产欧美| 亚洲人成在线观看| 国产免费成人在线视频| 欧美不卡在线视频| 国产精品v欧美精品v日韩 | 欧美成人有码| 国产精品国产三级国产a| 久久久久久久久久久久久久一区| 欧美夫妇交换俱乐部在线观看| 亚洲欧美中文字幕| 免费永久网站黄欧美| 欧美在线一二三区| 欧美激情区在线播放| 欧美一级成年大片在线观看| 久久一区二区视频| 午夜在线播放视频欧美| 女同一区二区| 久久久精品国产免大香伊| 欧美日韩卡一卡二| 欧美成人精品| 国产综合精品一区| 亚洲一区二区三区精品视频| 亚洲黄色在线| 久久精品女人天堂| 亚洲欧美视频在线观看视频| 男人的天堂亚洲| 美女国内精品自产拍在线播放| 欧美四级伦理在线| 亚洲人成在线观看网站高清| 亚洲高清视频的网址| 亚洲综合激情| 亚洲欧美日韩一区二区三区在线观看| 欧美精品v国产精品v日韩精品| 卡一卡二国产精品| 国产欧美日韩一区二区三区在线| 亚洲精品久久在线| 亚洲精品久久| 久热re这里精品视频在线6| 欧美一区二区性| 国产精品男女猛烈高潮激情 | 在线一区观看| 欧美日韩久久精品| 亚洲日产国产精品| 欧美在线高清视频| 欧美专区中文字幕| 国产日产高清欧美一区二区三区| 在线亚洲伦理| 欧美一区三区二区在线观看| 欧美三级小说| 亚洲一区二区三区四区在线观看 | 国产精品va在线播放| 洋洋av久久久久久久一区| 亚洲一区国产视频| 国产精品人成在线观看免费 | 欧美中文字幕在线| 久久亚洲国产精品日日av夜夜| 国产午夜精品麻豆| 久久国产精品一区二区三区| 亚洲国产精品成人综合色在线婷婷| 伊人狠狠色丁香综合尤物| 香蕉久久精品日日躁夜夜躁| 久久丁香综合五月国产三级网站| 国产午夜精品理论片a级探花 | 欧美精品观看| 99riav久久精品riav| 新狼窝色av性久久久久久| 国产视频一区二区在线观看| 久久久精品国产一区二区三区| 欧美 日韩 国产精品免费观看| 亚洲精品久久久一区二区三区| 欧美日韩大陆在线| 午夜精品视频在线观看一区二区| 狼狼综合久久久久综合网| 亚洲日韩欧美视频一区| 国产精品成人国产乱一区| 久久久精品动漫| 一本大道久久a久久综合婷婷| 先锋影音一区二区三区| 在线日本成人| 国产精品久久久久久久久婷婷| 久久精品亚洲国产奇米99| 91久久综合| 久久久久久网| 国产精品99久久久久久人| 国产一区视频观看| 欧美理论电影网| 久久精品国产清自在天天线| 亚洲人成7777| 久久天堂国产精品| 宅男噜噜噜66一区二区| 狠狠网亚洲精品| 国产精品成人在线观看| 久久中文字幕导航| 性亚洲最疯狂xxxx高清| 亚洲美女av黄| 亚洲国产导航| 老色鬼精品视频在线观看播放| 亚洲午夜视频| 99在线热播精品免费99热| 精品不卡一区| 国产乱码精品一区二区三区不卡 | 久久久久欧美| 午夜在线观看欧美| 亚洲美女av电影| 永久91嫩草亚洲精品人人| 国产精品一区二区你懂的| 欧美区日韩区| 欧美久久久久中文字幕| 免费成人激情视频|