【学習ノート】CF1817F もつれた部分文字列(基本的な部分文字列構造)

前提知識: 基本的な部分文字列構造、SAM の構造と応用

シニアブログ

超弦理論は比較的抽象的なため、直感的に理解することをお勧めします。

部分文字列_tの拡張文字列は ext(t) : = t ' \text{ext(t)}:=t'として定義されます。内線(t):=t満足ですtttはt't'ですt'の部分文字列occ(t) = occ(t') \text{occ(t)}=\text{occ(t')}occ(t)=occ(t')

基本特性: if t = [ l : r ] , t ' = [ l ' : r ' ] t=[l:r],t'=[l':r']t=[ l:r ] t=[ l:r'' ]t '' = [ l '' : r '' ] t''=[l'':r'']t「」=[ l「」:r'' ],利用l '' ≤ l '' ≤ l ≤ r ≤ r '' ≤ r '' l'\le l'\le l\le r\le r''\le r'「」rr「」r,则ext(t”) = t ′ \text{ext(t'')}=t'内(t”)=t

部分文字列x 、 yx、y× y は、 ext(x) = ext(y) \text{ext(x)}=\text{ext(y)} の場合にのみ同等です。拡張子(x)=ext(y) . そして、各同値類の最も長い文字列を代表要素として記録します。

s[l:r] ↦(l,r) s[l:r]\mapsto(l,r)s [ l:r ]( l r )の作用下でy = xy=xy=xより上の点は、同値クラスによっていくつかのはしご状のセットに分割されます。ここで、g \text{g}gに対応するラダーの出現数はocc(rep(g)) \text{occ(\text{rep(g)})} となりますocc( rep(g) )

同値クラスggの場合特定の完全なステップでは、完全な行に対応する部分文字列のセットはT 0 T_0と同じです。T0のノードに対応する部分文字列のセットは同じであり、完全な列に対応する部分文字列のセットはT 1 T_1と同じです。T1(逆文字列に対応する接尾語木) あるノードに対応する部分文字列の集合は同一であり、1対1に対応する。

同値クラスggを定義するgの周囲長はラダーの行数とシーケンス数の合計∑ g per(g) = O ( n ) \sum_g\text{per(g)}=O(n)g(g)あたり=O ( n )

もっと抽象的。あまり直感的ではありません。

この構造を明示的に見つけるにはどうすればよいでしょうか?

最初の方法: T 0 T_0の場合T0父から子へのツリー エッジ。ある行の左境界から別の行の右境界までを指します。T 1 T_1の場合T1ある列の上端から別の列の下端までを結ぶ、父から子への木の端。

たとえば、s = aababcd ‾ s=\underline{\text{aababcd}}s=お父さん、それに対応するラダーは次のように分割されます。

画像の説明を追加してください
対応するSAM SAMS AMT 0 T_0T0のために:

画像の説明を追加してください

対応する接続​​エッジは次のとおりです。

画像の説明を追加してください

2 番目の方法 (より一般的に使用されると思われます): DAG DAGの場合DA G上の( u , v ) (u,v )(あなたv ),如果occ(u) = occ(v) \text{occ(u)}=\text{occ(v)}occ(u)=occ(v) を使用して、このエッジをキー エッジとしてマークします。

プロパティ: クリティカル エッジのみが保持される場合、各ポイントの入次数と出次数は最大でも 1 つであるため、いくつかのクリティカル チェーンが得られます。明らかに、チェーンの終端が代表要素であり、チェーンは同値クラスを表します。

この質問が私たちに何を求めているのか考えてみましょう。文字列のペア(b 1, b 2) (b_1,b_2)を見つけることができます。( b1b2) は、次の条件が満たされる場合にのみ有効です。

1.1 1.11.1 b 1 、b 2 b_1、b_2b1b2同一等価クラス内
1.2 1.21.2 b 1 , b 2 b_1,b_2 とするb1b2同値類の代表要素はbbですb,那么 b 1 , b 2 b_1,b_2 b1b2bbbに現れる位置はb 1 b_1b1b 2 b_2b2

このようにして、各階段の答えを数えることができます。(数字と図形の組み合わせ、下付き文字を明確にすることをお勧めします)

要素のlen \text{len}を表しますLen は実際には、はしごの左上隅の水平座標と垂直座標の差を表します。

複雑さO ( n ) O(n)O ( n )

#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pb push_back
using namespace std;
const int N=2e5+5;
struct node{
    
    
    int to[26],link,len,sz;
}t[N];
int n,cur,last,tot,sz[N];
void extend(int ch){
    
    
    int cur=++tot;
    t[cur].len=t[last].len+1,t[cur].sz=1;
    int p=last;
    while(p!=-1&&!t[p].to[ch]){
    
    
        t[p].to[ch]=cur;
        p=t[p].link;
    }
    if(p!=-1){
    
    
        int q=t[p].to[ch];
        if(t[q].len==t[p].len+1){
    
    
            t[cur].link=q;
        }
        else{
    
    
            int clone=++tot;
            t[clone].link=t[q].link;
            for(int i=0;i<26;i++)t[clone].to[i]=t[q].to[i];
            t[clone].len=t[p].len+1;
            while(p!=-1&&t[p].to[ch]==q){
    
    
                t[p].to[ch]=clone;
                p=t[p].link;
            }
            t[q].link=t[cur].link=clone;
        }
    }
    last=cur;
}
string str;
int nxt[N],vs[N];
int st[N],cnt;
ll s[N];
ll res;
vector<int>G[N];
void dfs(int u){
    
    
    for(auto v:G[u])dfs(v),t[u].sz+=t[v].sz;
}
int main(){
    
    
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    t[0].link=-1;cin>>str,n=str.size();
    for(int i=0;i<n;i++)extend(str[i]-'a');
    for(int i=1;i<=tot;i++)G[t[i].link].pb(i);
    dfs(0);
    for(int i=1;i<=tot;i++){
    
    
        for(int j=0;j<26;j++){
    
    
            int k=t[i].to[j];
            if(k&&t[i].sz==t[k].sz)nxt[i]=k,vs[k]=1;
        }
    }
    for(int i=1;i<=tot;i++){
    
    
        if(vs[i]==0){
    
    
            cnt=0;int e=0;
            for(int j=i;j;j=nxt[j])e=j,st[++cnt]=t[j].len-t[t[j].link].len;
            for(int j=1;j<=cnt;j++)s[j]=s[j-1]+st[j];
            int p=1,len=t[e].len;
            for(int j=len-cnt+1;j<=st[cnt]&&j<=len+1;j++){
    
    
                while(p<=cnt&&st[p]<j)p++;
                res+=s[cnt-len+j-1]*(cnt-p+1);
            }
        }
    }cout<<res;
}

おすすめ

転載: blog.csdn.net/cqbzlydd/article/details/133413573