POJ 2541 Binary Witch 状压DP
2016-08-05 15:47
239 查看
哆啦A梦的时空隧道
题目大意:
这个题题意好难理解……(直接说英语差就好了….>_<)
给出一个长度为n的01串,要求根据此01串预测出长度为l的01串
预测n+1位时,找出已知串中最长的等于后缀的子串,那么第n+1位就是子串的后一位,然后把n+1位插入到已知串,再求n+2位…….
分析:
大家好像都用KMP写的……
然而正解是状压DP…..
f[i][j]代表长度为i,内容为j的01串最晚出现位置(这个位置是j的最后一位的出现位置)…..
然后枚举i=1~n+l代表当前要填第i位,那么当前f[j][tmp]代表的是1~i-2的01串中tmp的最晚出现位置,我们枚举j,也就是后缀的长度,看是否存在子串预支相同,如果存在,填上i位,最后更新f[j][tmp]
代码如下:
by >_< neighthorn
题目大意:
这个题题意好难理解……(直接说英语差就好了….>_<)
给出一个长度为n的01串,要求根据此01串预测出长度为l的01串
预测n+1位时,找出已知串中最长的等于后缀的子串,那么第n+1位就是子串的后一位,然后把n+1位插入到已知串,再求n+2位…….
分析:
大家好像都用KMP写的……
然而正解是状压DP…..
f[i][j]代表长度为i,内容为j的01串最晚出现位置(这个位置是j的最后一位的出现位置)…..
然后枚举i=1~n+l代表当前要填第i位,那么当前f[j][tmp]代表的是1~i-2的01串中tmp的最晚出现位置,我们枚举j,也就是后缀的长度,看是否存在子串预支相同,如果存在,填上i位,最后更新f[j][tmp]
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio>//f[i][j]代表长度为i内容为j的子串的最晚出现位置 using namespace std; const int maxn=1000000+5,maxl=1000+5; int n,l,f[14][1<<13]; char num[maxn+maxl]; signed main(void){ while(scanf("%d%d",&n,&l)!=EOF){ scanf("%s",num+1),memset(f,-1,sizeof(f)); for(int i=1;i<=n+l;i++){ int tmp=0; if(i>n) num[i]='0'; for(int j=1;i-j>=1&&j<=13;j++){ tmp+=num[i-j]=='0'?0:(1<<(j-1)); if(i>n&&f[j][tmp]!=-1) num[i]=num[f[j][tmp]+1]; f[j][tmp]=i-1; } }//1101110010 for(int i=1;i<=l;i++) cout<<num[i+n]; puts(""); } return 0; }
by >_< neighthorn
相关文章推荐
- poj 2541 Binary Witch(状压dp)
- poj 2541 (kmp 或 状压dp)
- POJ 2430 Lazy Cows 状压DP
- POJ - 3254 - Corn Fields (状压DP)
- POJ 2411 Mondriaan's Dream (状压DP)
- poj 2441 Arrange the Bulls (状压dp)
- [poj 2411]Mondriaan's Dream (状压dp)
- POJ - 1185 (状压DP)
- POJ 3254-Corn Fields(状压DP)
- POJ 3254 Corn Fields(状压dp)
- POJ 3254 Corn Fields 状压dp入门
- POJ 3311 Hie with the Pie(Floyd + 状压dp)
- poj 1185(状压dp)
- POJ 1795 DNA Laboratory(状压DP)
- POJ 1185(动态规划-状压dp)
- POJ 1185 NOI 2001 炮兵阵地 状压DP
- 琦神教我学DP———POJ-3254 Corn Fields 状压DP
- POJ 2411(状压dp)
- poj 2411&&hdu 1400 Mondriaan's Dream(状压DP)
- POJ 3254 Corn Fields (状压DP)