ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) C(二分+KMP)

2019-02-28 17:43:10  阅读:197  来源: 互联网

标签:Alex int Codeforces && return mod Round dp define


http://codeforces.com/contest/1129/problem/C

#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
#define lowbit(x) (x&(-x))
#define si(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define lc (d<<1)
#define rc (d<<1|1)
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=1e6+8;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+7;
const ULL base=1e7+7;
using namespace std;
LL a[maxn],b[maxn],Next[maxn];
LL dp[3008][3008];
void get_next(int m){
    Next[0]=-1;
    int k=-1;
    int j=0;
    while(j<m){
        while(k>-1&&b[k]!=b[j]){
            k=Next[k];
        }
        if(b[k]==b[j]||k==-1){
            k++;
        }
        Next[++j]=k;
    }
}
bool kmp(int n,int m){
    int k=0;
    for(int i=n-m+1;i<=n;i++){
        b[k++]=a[i];
    }
    get_next(m);
    k=0;
    for(int i=0;i<n;i++)
    {
        while(k>0&&b[k]!=a[i]){
            k=Next[k];
        }
        if(b[k]==a[i]){
            k++;
        }
        if(k==m){
            return 1;
        }
    }
    return 0;
}
bool check(int l){
    if(a[l]==0&&a[l+1]==0&&a[l+2]==1&&a[l+3]==1) return 0;
    if(a[l]==0&&a[l+1]==1&&a[l+2]==0&&a[l+3]==1) return 0;
    if(a[l]==1&&a[l+1]==1&&a[l+2]==1&&a[l+3]==0) return 0;
    if(a[l]==1&&a[l+1]==1&&a[l+2]==1&&a[l+3]==1) return 0;
    return 1;
}
int main(){
    int n;
    LL sum=1;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        if(i==0){
            dp[0][0]=1;
            printf("1\n");
        }
        else{
            int l=1,r=i;
            int ans=0;
            while(l<=r){
                int mid=(l+r)>>1;
                if(kmp(i,mid)){
                    l=mid+1;
                    ans=max(ans,mid);
                }
                else{
                    r=mid-1;
                }
            }
            dp[i][i]=1;
            if(i>0) dp[i-1][i]=1;
            if(i>1) dp[i-2][i]=1;
            if(i>2&&check(i-3)) dp[i-3][i]=1;
            for(int j=i-4;j>=0;j--){
                dp[j][i]+=dp[j][i-4]*dp[i-3][i];
                dp[j][i]%=mod;
            }
            for(int j=i-3;j>=0;j--){
                dp[j][i]+=dp[j][i-3]*dp[i-2][i];
                dp[j][i]%=mod;
            }
            for(int j=i-2;j>=0;j--){
                dp[j][i]+=dp[j][i-2]*dp[i-1][i];
                dp[j][i]%=mod;
            }
            for(int j=i-1;j>=0;j--){
                dp[j][i]+=dp[j][i-1]*dp[i][i];
                dp[j][i]%=mod;
            }
            for(int j=i-ans;j>=0;j--){
              sum+=dp[j][i];
              sum%=mod;
            }
            printf("%lld\n",sum);
        }
    }
}

 

标签:Alex,int,Codeforces,&&,return,mod,Round,dp,define
来源: https://www.cnblogs.com/Profish/p/10451813.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有