码迷,mamicode.com
首页 > 其他好文 > 详细

【洛谷八连测R5】whzzt-Warmth

时间:2017-10-28 22:35:43      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:http   描述   回文   ges   none   lin   class   emc   def   

题目描述

题目难度不一定按照题目顺序递增

给定一个序列 S,每次询问这个序列的一个连续子序列的本质不同回文子序列个数。

本质不同的含义是:两个序列不同当且仅当它们的长度不同或存在对应位置不同。

答案可能很大,因此只要输出对 10^9+7 算术取模的值。

输入输出格式

技术分享

说明

技术分享

代码

85分

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mo=1e9+7;
const int maxn=2000+5;
typedef long long ll;
inline void read(int &x){
    x=0; char ch=getchar();
    while(ch<0||ch>9) ch=getchar();
    while(ch>=0&&ch<=9){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
}
int T,n,m,k;
int a[maxn],L[maxn][maxn],R[maxn][maxn],dp[maxn][maxn];
bool vis[maxn][maxn];
int dfs(int x,int y){
    if(vis[x][y]) return dp[x][y];
    if(x>y) return 0;
    ll ans=0;
    for(int i=1;i<=k;++i)
    if(R[x][i]&&L[y][i])
        ans+=dfs(R[x][i]+1,L[y][i]-1)+(R[x][i]<=L[y][i])+(R[x][i]<L[y][i]);
    vis[x][y]=true;
    return dp[x][y]=ans%mo;
}
int main(){
    read(T);
    while(T--){
        read(n);read(m);read(k);
        for(int i=1;i<=n;++i) read(a[i]);
        for(int i=1;i<=n;++i)
            memcpy(L[i],L[i-1],sizeof(L[i-1])),L[i][a[i]]=i;
        for(int i=n;i>=1;--i)
            memcpy(R[i],R[i+1],sizeof(R[i+1])),R[i][a[i]]=i;
        for(int i=1;i<=m;++i){
            int x,y; read(x);read(y);
            printf("%d\n",dfs(x,y));
        }
        memset(vis,0,sizeof(vis));
    }
    return 0;
}
    
View Code

100分

技术分享
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=6000+5;
const int mo=1e9+7;
inline void read(int &x){
    x=0; char ch=getchar();
    while(ch<0||ch>9) ch=getchar();
    while(ch>=0&&ch<=9){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
}
int T,n,m,k;
int a[maxn],pre[maxn],head[1005],f[maxn][maxn];
int main(){
    read(T);
    while(T--){
        read(n);read(m);read(k);
        memset(head,0,sizeof(head));
        for(int i=1;i<=n;++i){
            read(a[i]); pre[i]=head[a[i]]; head[a[i]]=i;
        }
        memset(head,0,sizeof(head));
        for(int i=n;i>=1;--i){
            head[a[i]]=i;
            for(int j=i;j<=n;++j){
                int k=head[a[j]],p=pre[j],w=(p<k&&k<=j)+(p<=k&&k<j);
                f[i][j]=(f[i][j-1]-f[k+1][p-1]+f[k+1][j-1]+w)%mo;
                if(f[i][j]<0) f[i][j]+=mo;
            }
        }
        for(int i=1;i<=m;++i){
            int x,y; read(x);read(y);
            printf("%d\n",f[x][y]);
        }
    }
    return 0;
}
View Code

 

【洛谷八连测R5】whzzt-Warmth

标签:http   描述   回文   ges   none   lin   class   emc   def   

原文地址:http://www.cnblogs.com/huihao/p/7748364.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!