您的位置:首页 > 其它

第十七周 6.20 --- 6.26

2016-06-21 11:25 190 查看
6.20 --- 6.23

发呆..

6.24

周杰伦的床边故事>.<...............开心

cf349 div2 C - Robbers' watch

想到了数的位数不会超过7位,但是暴力的姿势不对

自己 是每一位 去枚举,然后还要枚举分割点,还要判重,很麻烦

还崩掉了

标程的办法,直接枚举数值

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int mod = 1e9+7;
const int maxn = 5e3+5;
int dp[maxn][maxn],g[maxn][maxn],lcp[maxn][maxn];
int n;
char s[maxn];

int dayu(int i,int j,int len){
if(lcp[i][j] >= len) return 0;
int cc = lcp[i][j];
return s[i+cc] > s[j+cc];
}

void solve(){
memset(lcp,0,sizeof(lcp));
for(int i = n;i >= 1;i--){
for(int j = n;j >= 1;j--){
if(s[i] == s[j]) lcp[i][j] = lcp[i+1][j+1]+1;
}
}

memset(dp,0,sizeof(dp));memset(g,0,sizeof(g));
for(int i = 1;i <= n;i++){
for(int j = 1;j < i;j++){
g[i][j] = g[i][j-1];
if(s[i-j+1] == '0') continue;
dp[i][j] = (dp[i][j] + g[i-j][min(j-1,i-j)])%mod;
if(dp[i-j][j] && dayu(i-j+1,i-2*j+1,j)){
dp[i][j] = (dp[i][j]+dp[i-j][j])%mod;
}
g[i][j] = (g[i][j]+dp[i][j])%mod;
}
dp[i][i] = 1;
g[i][i] = (g[i][i-1]+dp[i][i])%mod;
}
int ans = 0;
for(int i = 1;i <= n;i++){
ans = (ans+dp
[i])%mod;
}
printf("%d\n",ans);
}

int main(){
while(scanf("%d",&n) != EOF){
scanf("%s",s+1);
solve();
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: