hdu 6170 Two strings

dp[i][j]代表s1的前i个字符和s2的前j个字符匹配的情况,记录此时s2[j-1]匹配的字符。-1代表不匹配,0代表s2[j-1]匹配空字符。

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
#define fs first
#define sc second
#define mp make_pair
#define L(x) (1<<x)
#define next Next
using namespace std;
const int inf=1e9+10;
const ll llinf=1e16+10;
const int maxn=25e2+10;
const int maxm=1e3+10;
const int mod=1e9+7;
char s1[maxn],s2[maxn];
int len1,len2;
char dp[maxn][maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    int ncas;
    scanf("%d",&ncas);
    while(ncas--)
    {
        scanf("%s %s",s1,s2);
        cls(dp,-1);
        len1=strlen(s1);
        len2=strlen(s2);
        dp[0][0]=0;
        for(int i=0;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                if(s1[i-1]==s2[j-1] && dp[i-1][j-1]!=-1 &&i!=0)
                    dp[i][j]=s1[i-1];
                else if( s2[j-1]==‘.‘ && dp[i-1][j-1]!=-1 &&i!=0)
                    dp[i][j]=s1[i-1];
                else if(s2[j-1]==‘*‘)
                {
                    if(dp[i-1][j-1]==s1[i-1])//由前一个重复
                        dp[i][j]=s1[i-1];
                    else if(dp[i-1][j]==s1[i-1])//当前的重复
                        dp[i][j]=s1[i-1];
                    if((dp[i][j-2]!=-1&&j!=1)||dp[i][j-1]!=-1)//重复0次或1次
                        dp[i][j]=0;
                }
            }
        }
        printf("%s\n",dp[len1][len2]!=-1?"yes":"no");
    }
    return 0;
}
时间: 2024-12-30 02:53:04

hdu 6170 Two strings的相关文章

HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9

/* HDU 6170 - Two strings [ DP ] | 2017 ZJUT Multi-University Training 9 题意: 定义*可以匹配任意长度,.可以匹配任意字符,问两串是否匹配 分析: dp[i][j] 代表B[i] 到 A[j]全部匹配 然后根据三种匹配类型分类讨论,可以从i推到i+1 复杂度O(n^2) */ #include <bits/stdc++.h> using namespace std; const int N = 2505; int t;

HDU 6170 Two strings 思维 DP

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6170 题目描述: 两个字符串问是否匹配, '.'可以匹配任意字符, '*'可以使前一个数的出现次数成上一个自然数(0, 1, 2, 3........) 解题思路: DP, dp(i, j)表示A串匹配到j位, B串匹配到i位两个串是否匹配, 转移方程再代码里有, 参考Jaihk662的博客, 注释在代码中 代码: #include <iostream> #include <cstdio&

2017多校第9场 HDU 6170 Two strings DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. 解法:dp[i][j]代表在第一个串的i位置,第2个串的j位置是否可以匹配,然后按照'*'这个特殊情况讨论转移即可. #include <bits/stdc++.h> using namespace std; const int maxn = 3005; bool dp[maxn][maxn];

HDU 6170 Two strings (DP)

题意:给定两个字符串,问你是不是匹配,这不是完全的正则表达式,而且题意有点模糊,'.'能匹配任意字符.'*'能匹配前面一个字符重复0-无数多次,如果是 . *  这样的是先匹配 .,再匹配*. 析:dp[i][j] 表示 第一个串匹配到 i 第二串匹配到 j,是不是能. 如果是a[i] == b[j] 那就是 dp[i-1][j-1] 如果 b[j] == '.' 就是 dp[i-1][j-1] 如果 b[j] == '*' 那么要分情况,一种是 a[i] == a[i-1]  就是 dp[i-

HDU 2736 Surprising Strings

Surprising Strings Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description The D-pairs of a string of letters are the ordered pairs of letters that are distance D from each other. A string is D-unique if all of its D-

HDU 6170 dp

Two strings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 485    Accepted Submission(s): 178 Problem Description Giving two strings and you should judge if they are matched.The first string co

hdu 2406 Power Strings KMP

Power Strings                                                               Time Limit:3000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u Description Given two strings a and b we define a*b to be their concatenation. For example, if a =

hdu 6170

题意:正则表达式匹配 思路:DP   dp[i][j]表示b串中0~i与0~j是否可以匹配,具体的转移看代码: #include<cstdio> #include<cstring> #include<string> using namespace std; const int maxn=2600; char a[maxn],b[maxn]; bool dp[maxn][maxn]; int main() { freopen("input.txt",&

矩阵十题【五】 VOJ1049 HDU 2371 Decode the Strings

题目链接:https://vijos.org/p/1049 题目大意:顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列.m<=10, k<2^31. 首先将这m个置换"合并"起来(算出这m个置换的乘积),然后接下来我们需要执行这个置换k/m次(取整,若有余数则剩下几步模拟即可).注意任意一个置换都可以表示成矩阵的形式.例如,将1 2 3 4置换为3 1 2 4,相当于下面的矩阵乘法: 置换k/m次就相当于在前面乘以k/m个这样的矩阵.我们可以二分计