对答案 解题报告

对答案

题目描述

企鹅豆豆做完了作业,找你帮他检查。豆豆写的作业由小写字母组成。但由于一道题有多种答案,所以答案中除了小写字母以外还有’.’’*’
‘.’字符可以变成任意一个小写字母。
‘x*’可以变成‘’(空串)、‘x’‘xx’‘xxx’等等,即可以变任意个字符 \(x\)(其中 \(x\) 可以是小写字符或者’.’
现在,有标准答案以及豆豆的作业,请你判断豆豆的作业是不是完全正确的。
数据保证*不会出现在开头,不会有两个连续的*

输入说明

第一行一个整数 \(T\),表示数据组数。
对于每组数据,第一行一个字符串,表示豆豆的作业。第二行一个字符串,表示答案。

输出说明

对于每组数据,输出一行一个字符串,如果作业正确输出“yes”,否则输出“no”(不含引号)

数据规模及约定

对于\(30\%\)的数据,字符串长度\(\le 10\)
对于\(70\%\)的数据,字符串长度\(\le 200\)
对于\(100\%\)的数据,字符串长度\(\le 2500\), \(T\le 15\)


思路:\(dp\)

\(dp_{i,j}\)代表作业串\(a\)匹配到\(i\)答案串\(b\)匹配到\(j\)时是否可以匹配上。

有转移

\(dp_{i,j}=dp_{i-1,j}|dp_{i-1,j-1} ,\tt{if \ a_i = a_{i-1} \&\& b_j='*'}\)

\(dp_{i,j}=dp_{i-1,j-1} \tt{if \ a_i=b_j || b_j ='.'}\)

\(dp_{i,j}=dp_{i,j-2} \tt{if \ b_j='*'}\)


Code:

#include <cstdio>
#include <cstring>
const int N=2502;
int dp[N][N],n,T,len1,len2;
char a[N],b[N];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        memset(dp,0,sizeof(dp));
        scanf("%s%s",a+1,b+1);
        dp[0][0]=1;
        len1=strlen(a+1),len2=strlen(b+1);
        for(int i=1;i<=len1;i++)
            for(int j=1;j<=len2;j++)
            {
                if(a[i]==a[i-1]&&b[j]=='*')
                    dp[i][j]|=dp[i-1][j-1]|dp[i-1][j];
                if(a[i]==b[j]||b[j]=='.')
                    dp[i][j]|=dp[i-1][j-1];
                if(b[j]=='*'&&j>=2)
                    dp[i][j]|=dp[i][j-2];
            }
        if(dp[len1][len2]) puts("yes");
        else puts("no");
    }
    return 0;
}

2018.11.7

posted @ 2018-11-07 14:39  露迭月  阅读(180)  评论(0编辑  收藏  举报