• Codeforces Round #349 (Div. 1)E. Forensic Examination


    题意:给一个初始串s,和m个模式串,q次查询每次问你第l到第r个模式串中包含(s_l-s_r)子串的最大数量是多少
    题解:把初始串和模式串用分隔符间隔然后建sam,我们需要找到在sam中表示(s_l-s_r)子串的状态节点(先找到(s_r)对应的节点,然后倍增parent树即可),我们需要找到包含(s_l-s_r)的模式串,这些节点肯定在parent树上位于我们找到的状态节点的子树上.那么我们按sam的topo序进行线段树合并,线段树区间表示l,r模式串中最大匹配值以及下标.每次查询时先找初始串对应子串的状态节点,然后在该节点对应线段树中查询区间lr的最大匹配值.
    需要注意的是此时线段树合并当xy子树都不为空时,不能直接把xy合并到x上,需要新开节点.因为查询是对于每个节点都可能的.

    //#pragma GCC optimize(2)
    //#pragma GCC optimize(3)
    //#pragma GCC optimize(4)
    //#pragma GCC optimize("unroll-loops")
    //#pragma comment(linker, "/stack:200000000")
    //#pragma GCC optimize("Ofast,no-stack-protector")
    //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define db double
    #define mp make_pair
    #define pb push_back
    #define pi acos(-1.0)
    #define ll long long
    #define vi vector<int>
    #define mod 998244353
    #define ld long double
    //#define C 0.5772156649
    //#define ls l,m,rt<<1
    //#define rs m+1,r,rt<<1|1
    #define pll pair<ll,ll>
    #define pil pair<int,ll>
    #define pli pair<ll,int>
    #define pii pair<int,int>
    #define ull unsigned long long
    //#define base 1000000000000000000
    #define fin freopen("a.txt","r",stdin)
    #define fout freopen("a.txt","w",stdout)
    #define fio ios::sync_with_stdio(false);cin.tie(0)
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
    inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
    template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
    template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
    inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
    inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;}
    
    using namespace std;
    
    const ull ba=233;
    const db eps=1e-5;
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int N=600000+10,maxn=1000000+10,inf=0x3f3f3f3f;
    
    int rt[N<<1],ls[N*20],rs[N*20],tot;
    pii ma[N*20];
    inline pii Max(pii a,pii b)
    {
        if(a.fi!=b.fi)return max(a,b);
        return a.se < b.se ? a:b;
    }
    inline int Merge(int x,int y,int l,int r)
    {
        if(!x)return y;
        if(!y)return x;
        int o=++tot;
        if(l==r)
        {
            ma[o]=mp(ma[x].fi+ma[y].fi,l);
            return o;
        }
        int m=(l+r)>>1;
        ls[o]=Merge(ls[x],ls[y],l,m);
        rs[o]=Merge(rs[x],rs[y],m+1,r);
        ma[o]=Max(ma[ls[o]],ma[rs[o]]);
        return o;
    }
    void update(int &o,int pos,int l,int r)
    {
        if(!o)o=++tot;
        if(l==r){ma[o]=mp(ma[o].fi+1,l);return ;}
        int m=(l+r)>>1;
        if(pos<=m)update(ls[o],pos,l,m);
        else update(rs[o],pos,m+1,r);
        ma[o]=Max(ma[ls[o]],ma[rs[o]]);
    }
    pii query(int o,int L,int R,int l,int r)
    {
        if(!o)return mp(0,0);
        if(L<=l&&r<=R)return ma[o];
        int m=(l+r)>>1;pii ans=mp(0,0);
        if(L<=m)ans=Max(ans,query(ls[o],L,R,l,m));
        if(m<R)ans=Max(ans,query(rs[o],L,R,m+1,r));
        return ans;
    }
    char s[N];
    struct SAM{
        int last,cnt;
        int ch[N<<1][27],fa[N<<1],l[N<<1];
        int a[N<<1],c[N<<1],pos[N],f[N<<1][21];
        void ins(int x)
        {
            int p=last,np=++cnt;last=np;l[np]=l[p]+1;
            for(;p&&!ch[p][x];p=fa[p])ch[p][x]=np;
            if(!p)fa[np]=1;
            else
            {
                int q=ch[p][x];
                if(l[q]==l[p]+1)fa[np]=q;
                else
                {
                    int nq=++cnt;l[nq]=l[p]+1;
                    memcpy(ch[nq],ch[q],sizeof ch[q]);
                    fa[nq]=fa[q];fa[q]=fa[np]=nq;
                    for(;ch[p][x]==q;p=fa[p])ch[p][x]=nq;
                }
            }
        }
        void topo()
        {
            for(int i=1;i<=cnt;i++)c[l[i]]++;
            for(int i=1;i<=cnt;i++)c[i]+=c[i-1];
            for(int i=1;i<=cnt;i++)a[c[l[i]]--]=i;
        }
        int go(int x,int len)
        {
            int y=pos[x];
            for(int i=20;~i;i--)if(l[f[y][i]]>=len)y=f[y][i];
            return y;
        }
        void build()
        {
            scanf("%s",s+1);
            cnt=last=1;
            int len=strlen(s+1);
            for(int i=1;i<=len;i++)ins(s[i]-'a'),pos[i]=last;
            int m;scanf("%d",&m);
            for(int i=1;i<=m;i++)
            {
                scanf("%s",s+1);
                ins(26);int len=strlen(s+1);
                for(int j=1;j<=len;j++)ins(s[j]-'a'),update(rt[last],i,1,m);
            }
            topo();
            for(int i=cnt;i;i--)
            {
                f[i][0]=fa[i];
                if(fa[a[i]])rt[fa[a[i]]]=Merge(rt[fa[a[i]]],rt[a[i]],1,m);
            }
            for(int i=1;i<=20;i++)for(int j=1;j<=cnt;j++)
                f[j][i]=f[f[j][i-1]][i-1];
            int q;scanf("%d",&q);
            while(q--)
            {
                int a,b,c,d;
                scanf("%d%d%d%d",&a,&b,&c,&d);
                c=go(d,d-c+1);
                pii te=query(rt[c],a,b,1,m);
                printf("%d %d
    ",max(a,te.se),te.fi);
            }
        }
    }sam;
    int main()
    {
        sam.build();
        return 0;
    }
    /********************
    
    ********************/
    
  • 相关阅读:
    【sqli-labs】 less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)
    【sqli-labs】 less36 GET- Bypass MYSQL_real_escape_string (GET型绕过MYSQL_real_escape_string的注入)
    【sqli-labs】 less35 GET- Bypass Add Slashes(we dont need them) Integer based (GET型绕过addslashes() 函数的整型注入)
    【sqli-labs】 less34 POST- Bypass AddSlashes (POST型绕过addslashes() 函数的宽字节注入)
    【sqli-labs】 less33 GET- Bypass AddSlashes (GET型绕过addslashes() 函数的宽字节注入)
    【sqli-labs】 less31 GET- Blind -Impidence mismatch -Having a WAF in front of web application (GET型基于盲注的带有WAF注入)
    iptables(3)
    iptables(2)
    iptables(1)
    rsync服务部署
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/10665106.html
Copyright © 2020-2023  润新知