#116-【模擬】Shuffle them up
阿新 • • 發佈:2018-11-09
Description
給定兩個長度為len的字串s1和s2, 接著給出一個長度為len*2的字串s12。
將字串s1和s2通過一定的變換變成s12,找到變換次數
變換規則如下:
假設s1=12345,s2=67890
變換後的序列 s=6172839405
如果s和s12完全相等那麼輸出變換次數
如果不完全相等,s的前半部分作為s1,後半部分作為s2,重複上述過程。
Input
第一行給出T(1≤T≤1000),代表有T組資料,每組資料首先給出len(1≤len≤100),接著給出兩個長度為len的字串s1 s2 然後給出長度為len*2的字串s12。
Output
首先輸出處理資料組的編號(編號從1開始)
再輸出變換次數並換行。
注意兩個數字之間有空格。
對於變換次數,如果無需變換直接得到s12,那麼輸出0,如果無論怎麼變換都不會得到s12,那麼輸出 -1。
Sample Input
2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC
Sample Output
1 2
2 -1
直接模擬,如果反而到了之前出現的狀態,那顯然不可能。
#include <iostream> #include <string> #include <set> using namespace std; string s1, s2, s3, temp; set<string> s; int main(int argc, char** argv) { int t, n, res, _case = 0, i; scanf("%d", &t); while (t--) { res = 0; scanf("%d", &n); cin >> s1 >> s2 >> s3; printf("%d ", ++_case); if (s1 + s2 == s3) { printf("0\n"); continue; } temp = ""; for (i = 1; i <= n + n; ++i) { temp += ' '; // 防止下標越界 } s.clear(); s.insert(s1 + s2); for ( ; ; ) // 模擬 { for (i = 0; i < n; ++i) { temp[i+i] = s2[i]; temp[i+i+1] = s1[i]; } ++res; if (temp == s3) { printf("%d\n", res); break; } if (s.count(temp)) // 如果回到了之前到狀態,那麼顯然不可能做到 { printf("-1\n"); break; } s.insert(temp); s1 = temp.substr(0, n); s2 = temp.substr(n, n); } } return 0; }