首页 > 代码库 > 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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。