【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 ...
随机推荐
- checkBox控件的CheckedChanged与CheckedStateChanged区别
Checked属性为bool类型,CheckState属性为枚举类型(CheckState.Checked.CheckState.Unchecked和CheckState.Indeterminate) ...
- GDI+ 绘图闪烁解决方法
闲着没事,准备做一个类似于TeeChart的自定义控件,结果第一步的绘图就把我给难倒了,虽然早就知道GDI绘图的闪烁问题很坑,但是却没有想到如此之坑,折腾了两天,才找到解决方法. 首先在窗体加载的时候 ...
- jquery 点击查看,收起特效
<div class="all"> <p><a href="javascript:;" id="onvk"&g ...
- cocos3.10 使用cocostudio 回调特性 c++版本说明
cocos3.10 使用cocostudio 回调特性 c++版本说明 好久没捣鼓cocos2dx了,又拿起来玩玩,看着版本一次次的升级,真的好快,今天用cocos3.10版本测试下时间特性功能,跟着 ...
- redis使用watch完成秒杀抢购功能:
redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...
- 常用mysql命令大全
常用的MySQL命令大全 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再 ...
- 《C和指针》读书笔记——第五章 操作符和表达式
1.当/操作符的两个操作数都是整数时,它执行整除运算:其他都是执行浮点数除法. 2.逻辑移位:左边移入的位用0填充: 算数移位:左边移入的位用符号位填充: 3.位置1 :value |= 1<& ...
- linux 加载驱动后有permanent的解决办法
参考http://blog.csdn.net/zmnqazqaz/article/details/38058713解决 原因是系统默认内核使用gcc与当前编译模块gcc版本不同导致的. 查看内核默认使 ...
- VS2010中无法嵌入互操作类型“......”,请改用适用的接口的解决方法
- oracle linux了解基本命令行
1. Linux的版本:核心(kernel)版本和发行(distribution)版本 2. 复制.删除和移动文件的命令 cp [选项] 源文件或目录 目标文件或目录 -R,-r ...