【HDOJ】3386 Final Kichiku “Lanlanshu”
数位DP。
需要注意的是需要特殊处理前导0,另外连续的==匹配,不要计重了,尽量贪心的匹配掉。
/* 3886 */
#include <iostream>
#include <sstream>
#include <string>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <bitset>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <ctime>
#include <cstring>
#include <climits>
#include <cctype>
#include <cassert>
#include <functional>
#include <iterator>
#include <iomanip>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,1024000") #define sti set<int>
#define stpii set<pair<int, int> >
#define mpii map<int,int>
#define vi vector<int>
#define pii pair<int,int>
#define vpii vector<pair<int,int> >
#define rep(i, a, n) for (int i=a;i<n;++i)
#define per(i, a, n) for (int i=n-1;i>=a;--i)
#define clr clear
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1 const int mod = ;
const int maxl = ;
const int maxn = ;
char ps[maxl], ps_[maxl];
char sa[maxl], sb[maxl];
int a[maxl], plen;
int dp[maxl][maxn][][];
bool dp_[maxl][maxn]; void f(char *s, int& l) {
int len = strlen(s);
int i = ; l = ;
while (i<len- && s[i]=='')
++i;
while (i < len) {
s[l++] = s[i++]-'';
}
s[l] = '\0';
} bool check(char ch, int d, int dd) {
if (ch == '/')
return d < dd;
if (ch == '-')
return d == dd;
if (ch == '\\')
return d > dd;
return false;
} bool judge(char *s, int len) {
if (len== || check(ps[], s[], s[])==false)
return false; memset(dp_, false, sizeof(dp_));
dp_[][] = true; rep(j, , plen) {
rep(i, , len-) {
if (!dp_[j][i])
continue; if (check(ps[j], s[i], s[i+]))
dp_[j][i+] = true;
if (check(ps[j+], s[i], s[i+]))
dp_[j+][i+] = true;
}
} return dp_[plen][len-];
} int cal(char *s, int len) {
if (len <= )
return ; memset(dp, -, sizeof(dp));
rep(k, , s[]) {
rep(kk, , ) {
if (k == ) {
if (dp[][][][kk] == -)
dp[][][][kk] = ;
else
++dp[][][][kk];
continue;
} if (check(ps[], k, kk)) {
if (dp[][][][kk] == -)
dp[][][][kk] = ;
else
++dp[][][][kk];
}
}
}
rep(kk, , s[]+) {
int at = kk==s[];
if (check(ps[], s[], kk)) {
if (dp[][][at][kk] == -)
dp[][][at][kk] = ;
else
++dp[][][at][kk];
}
} rep(i, , plen+) {
int ii = i + ;
rep(j, , len-) {
int jj = j + ; // consider boundary
if (dp[i][j][][s[j]] >= ) {
rep(k, , s[j+]+) {
int at = k==s[j+]; if (check(ps[ii], s[j], k)) {
if (dp[ii][jj][at][k] >= ) {
dp[ii][jj][at][k] = (dp[ii][jj][at][k] + dp[i][j][][s[j]]) % mod;
} else {
dp[ii][jj][at][k] = dp[i][j][][s[j]];
}
} else if (check(ps[i], s[j], k)) {
if (dp[i][jj][at][k] >= ) {
dp[i][jj][at][k] = (dp[i][jj][at][k] + dp[i][j][][s[j]]) % mod;
} else {
dp[i][jj][at][k] = dp[i][j][][s[j]];
}
}
}
} // consider < boundary
rep(k, , ) {
if (dp[i][j][][k] < )
continue;
rep(kk, , ) {
if (i == ) {
if (k == ) {
if (dp[i][jj][][kk] >= ) {
dp[i][jj][][kk] = (dp[i][jj][][kk] + dp[i][j][][k]) % mod;
} else {
dp[i][jj][][kk] = dp[i][j][][k];
}
} else {
if (check(ps[ii], k, kk)) {
if (dp[ii][jj][][kk] >= ) {
dp[ii][jj][][kk] = (dp[ii][jj][][kk] + dp[i][j][][k]) % mod;
} else {
dp[ii][jj][][kk] = dp[i][j][][k];
}
}
}
continue;
} if (check(ps[ii], k, kk)) {
if (dp[ii][jj][][kk] >= ) {
dp[ii][jj][][kk] = (dp[ii][jj][][kk] + dp[i][j][][k]) % mod;
} else {
dp[ii][jj][][kk] = dp[i][j][][k];
}
} else if (check(ps[i], k, kk)) {
if (dp[i][jj][][kk] >= ) {
dp[i][jj][][kk] = (dp[i][jj][][kk] + dp[i][j][][k]) % mod;
} else {
dp[i][jj][][kk] = dp[i][j][][k];
}
}
}
}
}
} int ret = ; rep(k, , ) {
if (dp[plen][len-][][k] >= )
ret = (ret + dp[plen][len-][][k]) % mod;
if (dp[plen][len-][][k] >= )
ret = (ret + dp[plen][len-][][k]) % mod;
} return ret;
} void solve() {
int alen, blen;
int ans = , tmp; plen = strlen(ps+);
f(sa, alen);
f(sb, blen); tmp = cal(sb, blen);
ans += tmp;
tmp = cal(sa, alen);
ans -= tmp;
if (judge(sa, alen))
++ans; ans = (ans + mod) % mod;
printf("%08d\n", ans);
} int main() {
ios::sync_with_stdio(false);
#ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif while (scanf("%s", ps+)!=EOF) {
scanf("%s %s", sa, sb);
solve();
} #ifndef ONLINE_JUDGE
printf("time = %d.\n", (int)clock());
#endif return ;
}
【HDOJ】3386 Final Kichiku “Lanlanshu”的更多相关文章
- 【BZOJ3727】PA2014 Final Zadanie 树形DP
[BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...
- 【BZOJ3721】PA2014 Final Bazarek 贪心
[BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...
- 【Java】abstract,final,static,private,protected,public的区别
[abstract]抽象的 1. abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的类一定是 ...
- 【HDOJ】4729 An Easy Problem for Elfness
其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...
- 【HDOJ】【3506】Monkey Party
DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...
- 【HDOJ】【3516】Tree Construction
DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...
- 【HDOJ】【3480】Division
DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...
- 【HDOJ】【2829】Lawrence
DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...
- 【HDOJ】【3415】Max Sum of Max-K-sub-sequence
DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...
随机推荐
- prototype原型理解
一切都是对象,对象是若干属性的集合 数组是对象.函数是对象.对象还是对象.对象里面的一切都是属性,只有属性,没有方法.方法也是属性. 一切引用类型都是属性 怎么判断一个值是否是对象? 值类型的类型 ...
- IIS上的错误与解决方案
1.未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序. 解决方案:在IIS上打开该网站应用程序池-->高级设置-->启动32位程序-->选True
- Javascript倒计时页面跳转
在js中实现页面定时跳转我们要使用setInterval或setTimeOut函数,还可以使用页面的meta实现. 例1: <script type="text/javascript& ...
- Servlet实现web站点文件下载功能示例
前段时间事情比较多,导致二月份没有记录自己的学习情况.最近接触了servlet,参考韩老师的教程自己写了一个web站点文件下载的小项目,该项目中还加入了简单的反盗链技术. 1.首先创建一个Shared ...
- C语言字符串与字符数组
字符串儿与字符数组 字符数组的定义: Char buffer[]; 字符数组初始化: Char buffer1[]="hello world"; 利用scanf输入一个字符串儿 代 ...
- ARCGIS 10中添加excel点字段生产点shp文件的工具
菜单栏中——文件——添加数据——添加XY数据——选择excel。 选择x,y和投影(注意这里投影应该是原数据的本身投影,不能直接选择你要转换的投影)完成。
- MySQL的复制原理及配置
MySQL 的数据库的高可用性的架构大概有以下几种:集群,读写分离,主备.而后面两种都是通过复制来实现的.下面将简单介绍复制的原理及配置,以及一些常见的问题. 一.复制的原理 MySQL 复制基于主服 ...
- SQL一列多行字符串分组合并
最近工作遇到如下数据:需要合并后只剩下两行的数据,普通的group by 是不能实现的.(如图) 利用如下SQL代码,即可实现需求(如图): 利用 stuff 函数实现分拆合并操作 select Te ...
- awk 的一个奇怪异常
awk: cmd. line:1: (FILENAME=- FNR=192) fatal: print to "standard output" failed (No space ...
- @Entity设置实体lazy = false
问题描述 在通过Hibernate查询Bean信息时报以下异常信息: org.hibernate.LazyInitializationException: could not initialize p ...