hdu-5745 La Vie en rose bitset

http://acm.hdu.edu.cn/showproblem.php?pid=5745

第一次使用bitset这个东西,优点是可以常数优化,而此题优雅的bitset转移刚好可以卡过

转移方程是看的这篇博客,

http://blog.csdn.net/u012015746/article/details/51992281

首先得出一个 dp式子,dp[i][j][k]表示 A匹配到 iB匹配到 j 
而 k表示 Bj的交换情况,0为不动,1与前面交换,2与后面交换 
转移方程为: 
dpi,j,0=dpi1,j1,0 or dpi1,j1,1, (Ai==Bj) 
dpi,j,1=dpi1,j1,2, (Ai==Bj1) 
dpi,j,2=dpi1,j1,0 or dpi1,j1,1, (Ai==Bj+1)

此题数据改过,虽然博主的代码现在提交是t的,但转移方程很好理解

在转移的时候稍微改改减少几次位运算次数就可以了

#include
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
char s[100005],p[5005];
char ans[100005];
int n,m;
bitset<100005>dp[2][3];
bitset<100005>v[26];
int main()
{
	int T,i,j;
//	while(cin>>T)
    cin>>T;
	{
		while(T--)
		{
			cin>>n>>m;
			scanf(" %s",s);
			scanf(" %s",p);
			for(i=0;i<26;i++)
			v[i].reset();
			for(i=0;i>1)&v[i1];
                dp[now][1]=(dp[pre][2]>>1)&v[i2];
                if(i!=m-1)
                dp[now][2]=((dp[pre][0]|dp[pre][1])>>1)&v[i3];

				swap(now,pre);
			}
			for(i=0;i=0&&(dp[pre][0][n-i-m]|dp[pre][1][n-i-m]))
				ans[i]='1';
				else
				ans[i]='0';
			}
			ans[n]=0;
            printf("%s\n",ans);
		}
	}
	return 0;
 }



你可能感兴趣的:(hdu,-----,D,P,------)