hdu5763Another Meaning 2016 Multi-University Training Contest 4(kmp+dp)
来源:互联网 发布:mysql查看端口 编辑:程序博客网 时间:2024/06/04 20:03
首先用kmp找出所有模式串的位置放在id中(vector类型),然后做dp,dp方程为:
对于第i个位置,如果第j( j < i 中最大的 j )个位置满足
id[i]-id[j]>=son.size()(即模式串在主串中的这两个位置没有重叠部分),
则d[i]=d[i-1]+d[j];
如果这个j不存在则d[i]=d[i-1]+1。
#include<bits/stdc++.h>using namespace std;const int mod=1000000007;const int maxn=100000;vector<int>id;int nxt[maxn+5];string father,son;void getnext(){ nxt[0]=-1; int j=0,k=-1; while(j<son.size()){ if(k==-1||son[j]==son[k])nxt[++j]=++k; else k=nxt[k]; }}void kmp(){ getnext(); int i=0,j=0; while(i<(int)father.size()){ while(i<(int)father.size()&&j<(int)son.size()){//这里一定要将size()强转成int类型,不然就出错了 if(j==-1||father[i]==son[j])i++,j++; else j=nxt[j]; } if(j>=(int)son.size()){ id.push_back(i-j);//记录模式串在主串中的位置 j=nxt[j]; } }}long long d[maxn+5];long long dp(){ if(id.size()==0)return 1; d[0]=2; for(int i=1;i<id.size();i++){ int j; for(j=i-1;j>=0&&id[i]-id[j]<son.size();j--); if(j>=0)d[i]=(d[i-1]+d[j])%mod;//存在j else d[i]=(d[i-1]+1)%mod;//不存在j } return (d[id.size()-1])%mod;}int main(){ ios::sync_with_stdio(false); int T; cin>>T; for(int t=1;t<=T;t++){ cin>>father>>son; id.clear(); kmp(); printf("Case #%d: %lld\n",t,dp()); }}
0 0
- hdu5763Another Meaning 2016 Multi-University Training Contest 4(kmp+dp)
- DP+KMP——Another Meaning ( HDU 5763 ) ( 2016 Multi-University Training Contest 4 1001 )
- hdu 5763 Another Meaning(2016 Multi-University Training Contest 4——dp+kmp)
- 2016 Multi-University Training Contest 4 1001 Another Meaning (DP)
- 2016 Multi-University Training Contest 4 1001 Another Meaning
- 2016 Multi-University Training Contest 4 Another Meaning
- 2016 多校 Multi-University Training Contest 4 Another Meaning
- 2016 Multi-University Training Contest 4
- 2016 Multi-University Training Contest 4
- 2016 Multi-University Training Contest 4 题解
- HDU5729 2016 Multi-University Training Contest 1 (dp+连通图)
- hdu 5791 2016 Multi-University Training Contest 5(dp)
- 2016 Multi-University Training Contest 5 1011 Two(DP)
- 2016 Multi-University Training Contest 4题解报告
- 2016 Multi-University Training Contest 4 欢乐战记
- 2016 Multi-University Training Contest 4 题解(待续)
- 2016 Multi-University Training Contest 4 1006 Substring
- 2016 Multi-University Training Contest 4 1007 (hdu 5770)
- Codeforces 116B Little Pigs and Wolves
- chmod 权限777
- hdu5724——chess(博弈)(状态压缩dp+sg函数)
- android 日历本地账户
- UVA1339 UVALive3213 POJ2159 ZOJ2658 Ancient Cipher
- hdu5763Another Meaning 2016 Multi-University Training Contest 4(kmp+dp)
- elasticsearch-监控
- 安卓应该需要知道的开发和设计规范
- 氢离子浓度指数(ph值)
- svn: Can't remove file||不能进行cleanup||资源库同步时出错
- 杭电1241Oil Deposits
- poj 3259 Wormholes
- 版本更新
- 暑假集训7.28 各种模拟栈 sdutoj2134 括号匹配