1. 程式人生 > >#116-【模擬】Shuffle them up

#116-【模擬】Shuffle them up

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