首页 > 代码库 > topcoder srm 663 div1 -23

topcoder srm 663 div1 -23

1、给定两个只包含AB的字符串$S,T$。问是否存在一种操作序列将$S$变成$T$。操作有两种:(1)在$S$后加一个‘A’;(2)在$S$后加一个‘B‘并反转整个串。

思路:每次枚举$S$的两种变化,并判断新的串是否是$T$的子串。不是的话停止搜索。

#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>#include <cstring>using namespace std;const int mod=1000000007;set<string> S[55];int check(string s) {    return S[s.size()].find(s)!=S[s.size()].end();}string T;int dfs(string a,int n) {    if(a.size()==n) {        return a==T;    }    if(check(a+‘A‘)&&dfs(a+‘A‘,n)) {        return 1;    }    a+=‘B‘;    reverse(a.begin(),a.end());    if(check(a)&&dfs(a,n)) return 1;    return 0;}class ABBADiv1{public:    string canObtain(string a,string b)    {        for(int i=0;i<55;++i) S[i].clear();        for(int i=0;i<(int)b.size();++i) {            for(int j=i;j<(int)b.size();++j) {                int L=j-i+1;                string s=b.substr(i,L);                S[L].insert(s);                reverse(s.begin(),s.end());                S[L].insert(s);            }        }        T=b;        if(dfs(a,(int)b.size())) return "Possible";        return "Impossible";    }};

  

topcoder srm 663 div1 -23