POJ-3078.Shuffle'm Up(简单模拟题)
作者:互联网
这道题做了有四个小时吧,今天一整天都处于边玩边学的状态,我很是不喜欢...一开始用了20分钟模拟,过了样例后TLE了,就在考虑是不是判断是否重复判定的数组开大了,结果一直蛙,后面想到了map判重,结果由于还没有将BUG改完,都只是能过样例,最后看了题解,发现由于我菜将一个判断条件的位置写错了位置......
本次主要就是写教训的,感觉自己可能是已经麻木了就没有去仔细找BUG,知道错了...
本题大意:给出两个长度为len的字符串s1, s2和一个长度为2 * len的字符串s12,每次先让s2先s1后先后依次取一个字符得到一个长度为2 * len 的字符串s,如果发现得到的字符串s与s12相等就输出交换的次数,否则让s的左半边等于s1右半边等于s2再进行上面的变换,如果无法使的变换后的s == s12则输出-1。
本题思路:模拟。
参考代码:
1 #include <string> 2 #include <map> 3 #include <iostream> 4 using namespace std; 5 6 int len, ans, kase = 0; 7 bool flag; 8 9 int main () { 10 int T; 11 cin >> T; 12 map <string, bool> vis; 13 while(T --) { 14 vis.clear(); 15 string s1, s2, s12; 16 ans = 0; 17 cin >> len; 18 cin >> s1 >> s2 >> s12; 19 while(true) { 20 flag = true; 21 ans ++; 22 string str; 23 int i = 0; 24 for(int j = 0; j < len; j ++) { 25 str += s2[i ++]; 26 str += s1[j]; 27 } 28 if(vis[str] && str != s12) { 29 ans = -1; //记得判重条件要放到最前面 30 break; 31 } 32 vis[str] = true; 33 if(str == s12) break; 34 s1 = str.substr(0, str.size() / 2); 35 s2 = str.substr(str.size() / 2, str.size()); 36 } 37 cout << ++ kase << " " << ans << endl; 38 } 39 return 0; 40 }View Code
标签:Shuffle,int,s2,s1,Up,len,模拟题,str,s12 来源: https://www.cnblogs.com/bianjunting/p/10485970.html