数位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”的更多相关文章

  1. 【BZOJ3727】PA2014 Final Zadanie 树形DP

    [BZOJ3727]PA2014 Final Zadanie Description 吉丽YY了一道神题,题面是这样的:“一棵n个点的树,每条边长度为1,第i个结点居住着a[i]个人.假设在i结点举行 ...

  2. 【BZOJ3721】PA2014 Final Bazarek 贪心

    [BZOJ3721]PA2014 Final Bazarek Description 有n件商品,选出其中的k个,要求它们的总价为奇数,求最大可能的总价. Input 第一行一个整数n(1<=n ...

  3. 【Java】abstract,final,static,private,protected,public的区别

    [abstract]抽象的 1. abstract可以修饰类和成员方法,被abstract修饰的类称为抽象类,被abstract修饰成员方法叫抽象方法.抽象类不一定有抽象方法,但拥有抽象方法的类一定是 ...

  4. 【HDOJ】4729 An Easy Problem for Elfness

    其实是求树上的路径间的数据第K大的题目.果断主席树 + LCA.初始流量是这条路径上的最小值.若a<=b,显然直接为s->t建立pipe可以使流量最优:否则,对[0, 10**4]二分得到 ...

  5. 【HDOJ】【3506】Monkey Party

    DP/四边形不等式 裸题环形石子合并…… 拆环为链即可 //HDOJ 3506 #include<cmath> #include<vector> #include<cst ...

  6. 【HDOJ】【3516】Tree Construction

    DP/四边形不等式 这题跟石子合并有点像…… dp[i][j]为将第 i 个点开始的 j 个点合并的最小代价. 易知有 dp[i][j]=min{dp[i][j] , dp[i][k-i+1]+dp[ ...

  7. 【HDOJ】【3480】Division

    DP/四边形不等式 要求将一个可重集S分成M个子集,求子集的极差的平方和最小是多少…… 首先我们先将这N个数排序,容易想到每个自己都对应着这个有序数组中的一段……而不会是互相穿插着= =因为交换一下明 ...

  8. 【HDOJ】【2829】Lawrence

    DP/四边形不等式 做过POJ 1739 邮局那道题后就很容易写出动规方程: dp[i][j]=min{dp[i-1][k]+w[k+1][j]}(表示前 j 个点分成 i 块的最小代价) $w(l, ...

  9. 【HDOJ】【3415】Max Sum of Max-K-sub-sequence

    DP/单调队列优化 呃……环形链求最大k子段和. 首先拆环为链求前缀和…… 然后单调队列吧<_<,裸题没啥好说的…… WA:为毛手写队列就会挂,必须用STL的deque?(写挂自己弱……s ...

随机推荐

  1. 谷歌浏览器支持小于12px的字体

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. DataGridView 分页显示

    DataGridView 分页显示函数 1.获取当前页的子数据表函数 public static DataTable GetPagedTable(DataTable dt, int PageIndex ...

  3. Web开发常见的漏洞

    SQL注入漏洞 跨站脚本攻击漏洞 登陆后台管理页面 IIS短文件/文件夹漏洞 系统敏感信息泄露

  4. CentOS-6.5安装配置JDK-7|Tomcat-8

    安装说明 系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-x64.rpm 下载地址:http://www.oracle.com/technetwork/java/j ...

  5. 《WPF程序设计指南》读书笔记——第8章 依赖属性

    1.依赖属性的效果 一旦规定视觉树上一个对象的fontsize属性,那么属于他的节点之下的所有对象都会沿袭这个属性,然而如果某个子节点明确的设定了自己的fontsize,就不会沿袭父节点的fontsi ...

  6. 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient

    Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...

  7. You have new mail in /var/spool/mail/root 烦不烦你?

    http://blog.csdn.net/yx_l128125/article/details/7425182

  8. 两年的坚持,最后还是决定将ISoft开源

    还记得2011年9月份,我在上大四,本来想着考研能上个好点的学校,可我怎么就不愿去自习室上自习.每天晚上睡觉前都告诉自己明天早晨一定早起去上自习,但又每次醒来都不想起床啊,懒,没办法.睡到不想再睡了才 ...

  9. 如何使用 XSD

    如何使用 XSD 一个简单的 XML 文档: 请看这个名为 "note.xml" 的 XML 文档: <?xml version="1.0"?> & ...

  10. .substr()在字符串每个字母前面加上一个1

    var str = "abcdefghijklmnopq", name = "1", ary = []; for(var i = 0,len = str.len ...