博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 5763
阅读量:5774 次
发布时间:2019-06-18

本文共 1407 字,大约阅读时间需要 4 分钟。

 

 

给你串A和串B,|B| <= |A|

已知串B有两种可能含义,求串A的总可能含义数

dp[i]表示串A的从头开始长度为i的串的可能意义的数目

若该长度为i的串的后缀与模式串B匹配,则该后缀可以选择替换或者不替换

dp[i] = dp[i - 1] + dp[i - Bl]   否则dp[i] = dp[i - 1]

 

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #define INF 0x3f3f3f3f 8 #define MOD 1000000007 9 using namespace std;10 typedef long long LL;11 typedef unsigned long long ULL;12 const int maxn = 1e5 + 10;13 char s1[maxn], s2[maxn];14 int dp[maxn];15 const ULL B = 100000007;16 17 void contain(char *a, char *b) {18 int al = strlen(a), bl = strlen(b);19 ULL t = 1;20 for (int i = 0; i < al; i++) t *= B;21 ULL ah = 0, bh = 0;22 for (int i = 0; i < al; i++) ah = ah * B + a[i];23 for (int i = 0; i < al; i++) bh = bh * B + b[i];24 25 memset(dp, 0, sizeof(dp));26 for (int i = 0; i < al; i++) dp[i] = 1;27 28 for (int i = 0; i + al <= bl; i++) {29 dp[i + al] = dp[i + al - 1];30 if (ah == bh) {31 dp[i + al] = (dp[i + al] + dp[i]) % MOD;32 }33 if (i + al < bl) bh = bh * B + b[i + al] - b[i] * t;34 }35 }36 37 38 int main(int argc, const char * argv[]) {39 int T;40 scanf("%d", &T);41 for (int t = 1; t <= T; t++) {42 scanf("%s%s", s1, s2);43 contain(s2, s1);44 int l1 = strlen(s1);45 printf("Case #%d: ", t);46 printf("%d\n", dp[l1]);47 48 }49 return 0;50 }

 

转载于:https://www.cnblogs.com/xFANx/p/7280097.html

你可能感兴趣的文章
react报错this.setState is not a function
查看>>
poj 1183
查看>>
从根本解决跨域(nginx部署解决方案)
查看>>
javascript实现的一个信息提示的小功能/
查看>>
layer.js:2 Uncaught TypeError: Cannot read property 'extend' of undefined
查看>>
Centos7.x:开机启动服务的配置和管理
查看>>
HTML5 浏览器返回按钮/手机返回按钮事件监听
查看>>
使用 HPC Pack 为 Azure 中的 Windows HPC 工作负荷创建和管理群集的选项
查看>>
xss
查看>>
iOS:百度长语音识别具体的封装:识别、播放、进度刷新
查看>>
JS获取服务器时间并且计算距离当前指定时间差的函数
查看>>
java中关于重载与重写的区别
查看>>
最受欢迎的14款渗透测试工具
查看>>
华为硬件工程师笔试题
查看>>
jquery居中窗口-页面加载直接居中
查看>>
cd及目录快速切换
查看>>
黑马day11 不可反复度&amp;解决方式
查看>>
分布式服务化系统一致性的“最佳实干”--转
查看>>
一次Mutex死锁的原因探究
查看>>
flask的文件上传和下载
查看>>