hdu5745-La Vie en rose代码


<pre name="code" class="cpp">//TLE版
bool dp[N][2][3];
void work(){
    scanf("%d%d",&n,&m);
    scanf("%s%s",str+1,p+1);

    int Now=0,Next=1;
    for (int i=0;i<=n-m+1;i++)dp[i][0][0]=1,dp[i][0][1]=dp[i][0][2]=0;
    for (int j=1;j<=m;j++){
            for (int i=1;i<=n;i++){
                if (str[i]==p[j-1])dp[i][Next][0]=dp[i-1][Now][2];else dp[i][Next][0]=0;
                if (str[i]==p[j])  dp[i][Next][1]=dp[i-1][Now][0]|dp[i-1][Now][1];else dp[i][Next][1]=0;
                if (j<m && str[i]==p[j+1])dp[i][Next][2]=dp[i-1][Now][0]|dp[i-1][Now][1];else dp[i][Next][2]=0;
            }
            Now^=1,Next^=1;
    }
    for (int i=1;i<=n-m+1;i++)printf("%d",dp[i+m-1][Now][0]|dp[i+m-1][Now][1]|dp[i+m-1][Now][2]);
    for (int i=n-m+2;i<=n;i++)printf("0");puts("");
}


 

//AC版
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <bitset>

using namespace std;

typedef long long LL;
const int M=1000000007;
const int N=1e5+10;
char str[N],p[5555];
int n,m;
bitset<N>dp[2][3],y[26];
void work(){
    scanf("%d%d",&n,&m);
    scanf("%s%s",str+1,p+1);

    for (int i=0;i<26;i++)for (int j=1;j<=n;j++)y[i][j]=(str[j]-'a'==i)?1:0;
    int Now=0,Next=1;
    dp[0][0].set();dp[0][1].reset();dp[0][2].reset();
    for (int j=1;j<=m;j++){
            if (j>1)dp[Next][0]=(dp[Now][2]<<1)&y[p[j-1]-'a'];else dp[Next][0].reset();
            dp[Next][1]=((dp[Now][0]<<1)|(dp[Now][1]<<1))&y[p[j]-'a'];
            if (j<m)dp[Next][2]=((dp[Now][0]<<1)|(dp[Now][1]<<1))&y[p[j+1]-'a'];else dp[Next][2].reset();
            Now^=1,Next^=1;
    }
    for (int i=1;i<=n-m+1;i++)printf("%d",dp[Now][0][i+m-1]|dp[Now][1][i+m-1]|dp[Now][2][i+m-1]);
    for (int i=n-m+2;i<=n;i++)printf("0");puts("");
}
int main()
{
    //freopen("1.txt","r",stdin);
    int Case;scanf("%d",&Case);
    while (Case--)work();
    return 0;
}

题解参考http://bestcoder.hdu.edu.cn/blog/ 

2016 Multi-University Training Contest 2 solutions BY zimpha


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值