SCUT

https://scut.online/p/15
样例错了,按题目说的去做就AC了。
反向搜索使得最终比较strncmp的时候复杂度下降了很多(虽然应该可行性剪枝也少了)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

char s[64],t[64];
int cntE,cntX;
int maxl;

bool dfs(int curl,int E,int X) {
    if(curl==maxl) {
        if(cntE==E&&cntX==X&&strncmp(s,t,maxl)==0)
            return true;
        else
            return false;
    } else {
        if(s[curl-1]=='E'&&E-1>=cntE) {
            if(dfs(curl-1,E-1,X)) {
                return true;
            }
        }
        if(s[curl-1]=='X'&&X-1>=cntX) {
            reverse(s,s+curl-1);
            if(dfs(curl-1,E,X-1)) {
                return true;
            }
            reverse(s,s+curl-1);
        }
        return false;
    }
}

int main() {
#ifdef Yinku
    freopen("Yinku.in","r",stdin);
#endif // Yinku
    int T;
    scanf("%d",&T);
    while(T--) {
        scanf("%s%s",t,s);

        maxl=strlen(t);
        cntE=0;
        cntX=0;
        for(int i=0; i<maxl; i++) {
            if(t[i]=='E')
                cntE++;
            else
                cntX++;
        }

        int l=strlen(s);
        int curE=0,curX=0;
        for(int i=0; i<l; i++) {
            if(s[i]=='E')
                curE++;
            else
                curX++;
        }
        if(dfs(l,curE,curX)) {
            puts("Explosion!");
        } else {
            puts("Dekimasen");
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Yinku/p/11024258.html