判断两个串穿插起来能否变成另外一个串,dfs然后用dp优化下。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<string> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #define B(x) (1<<(x)) using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned ui; const int oo = 0x3f3f3f3f; //const ll OO = 0x3f3f3f3f3f3f3f3f; const double eps = 1e-9; #define lson rt<<1 #define rson rt<<1|1 void cmax(int& a, int b){ if (b > a)a = b; } void cmin(int& a, int b){ if (b < a)a = b; } void cmax(ll& a, ll b){ if (b > a)a = b; } void cmin(ll& a, ll b){ if (b < a)a = b; } void cmax(double& a, double b){ if (a - b < eps) a = b; } void cmin(double& a, double b){ if (b - a < eps) a = b; } void add(int& a, int b, int mod){ a = (a + b) % mod; } void add(ll& a, ll b, ll mod){ a = (a + b) % mod; } const ll MOD = 1000000007; const int maxn = 233; int dp[maxn][maxn]; char s1[maxn], s2[maxn], str[maxn << 1]; int L1, L2, L; int f; void dfs(int x, int y, int z){ if (f) return; if (x == L1 && y == L2 && z==L){ f = 1; return; } if (dp[x][y]) return; dp[x][y] = 1; if (s1[x] == str[z]) dfs(x + 1, y, z + 1); if (s2[y] == str[z]) dfs(x, y + 1, z + 1); } int main(){ //freopen("E:\\read.txt", "r", stdin); int T, cas = 1; scanf("%d", &T); while (T--){ scanf("%s%s%s", s1, s2, str); L = strlen(str); L1 = strlen(s1); L2 = strlen(s2); f = 0; memset(dp, 0, sizeof dp); dfs(0, 0, 0); if (f) printf("Data set %d: yes\n", cas++); else printf("Data set %d: no\n", cas++); } return 0; }