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;
}