zoukankan      html  css  js  c++  java
  • MemSQL Start[c]UP 2.0

    题意:给3个字符串,问从1到min(l1,l2,l3)的长度的子串,找到从该位置长度为l,三个子串相同的三元组的个数
    题解:把3个子串用分隔符串起来.然后分开统计每个节点在三个串中出现次数.最后乘起来就是该节点表示的三元组个数,然后l[fa[i]]+1到l[i]有贡献,对l差分一下就好了

    //#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 1000000007
    #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=300000+10,maxn=1000000+10,inf=0x3f3f3f3f;
    
    char s[N];
    struct SAM{
        int last,cnt;
        int ch[N<<1][27],fa[N<<1],l[N<<1],sz[N<<1][3];
        int a[N<<1],c[N<<1];
        ll dp[N<<1];
        void ins(int c,int id){
            int p=last,np=++cnt;last=np;l[np]=l[p]+1;
            for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
            if(!p)fa[np]=1;
            else
            {
                int q=ch[p][c];
                if(l[p]+1==l[q])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][c]==q;p=fa[p])ch[p][c]=nq;
                }
            }
            if(id>=0)sz[np][id]=1;
        }
        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;
        }
        void build(){
            last=cnt=1;
            int mi=inf;
            for(int i=0;i<3;i++)
            {
                scanf("%s",s);
                mi=min(mi,(int)strlen(s));
                for(int j=0;s[j];j++)ins(s[j]-'a',i);
                ins(26,-1);
            }
            topo();
            for(int i=cnt;i;i--)for(int j=0;j<3;j++)sz[fa[a[i]]][j]+=sz[a[i]][j];
            for(int i=1;i<=cnt;i++)
            {
                ll te=1ll*sz[i][0]*sz[i][1]%mod*sz[i][2]%mod;
                add(dp[l[fa[i]]+1],te);
                sub(dp[l[i]+1],te);
            }
            for(int i=1;i<=mi;i++)add(dp[i+1],dp[i]),printf("%lld
    ",dp[i]);
        }
    }sam;
    int main()
    {
        sam.build();
        return 0;
    }
    /********************
    
    ********************/
    
  • 相关阅读:
    438. Find All Anagrams in a String
    406. Queue Reconstruction by Height
    581. Shortest Unsorted Continuous Subarray
    416. Partition Equal Subset Sum
    124. Binary Tree Maximum Path Sum
    240. Search a 2D Matrix II
    160. Intersection of Two Linked Lists
    6. ZigZag Conversion
    iOS tableView 数据处理,数据分类相同数据整合、合并计算总数总价
    iOS 讯飞语音测试没问题,一上线就用不了了
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/10719788.html
Copyright © 2011-2022 走看看