【模板】序列自动机

const int LEN=100010;
const LL MOD=1000000007LL;

struct Sequential_Automaton{
    vector<int> Pos[LEN];
    int S[LEN],Last[LEN];
    LL f[LEN];
    int Len;

    void Input(int len){
        Len=len;
        for(RG i=1;i<=Len;++i){
            Read(S[i]);
            Pos[S[i]].push_back(i);
        }
    }

    bool Find(int *P,int LenP){//查询P是否是S的子序列
        int LastPos=0;
        for(RG i=1;i<=LenP;++i){
            auto it=upper_bound(Pos[P[i]].begin(),Pos[P[i]].end(),LastPos);
            if(it==Pos[P[i]].end()) return false;
            LastPos=*it;
        }
        return true;
    }

    LL Count_Subsequence(){//本质不同的子序列数目
        for(RG i=1;i<=Len;++i){
			f[i]=(f[i-1]<<1)%MOD;
			if(!Last[S[i]]) {Last[S[i]]=i;++f[i];}
			else {f[i]=(f[i]-f[Last[S[i]]-1]+MOD)%MOD;Last[S[i]]=i;}
        }
        return f[Len];
    }
};
原文地址:https://www.cnblogs.com/AEMShana/p/12439389.html