hdu 4357 String Change

比賽時A了。。。

以下轉自出題人解析:

當字符串長度爲2時:直接模擬即可(最多26次)。
當字符串長度大於2時:
1. 定義字符串的奇偶性爲該字符串所有字符之和的奇偶性。
2. 因爲每次變化操作字符串的字符和共增加了2,所以當字符串的奇偶
性不同時答案一定爲N O。
3. 當字符串的奇偶性相同時可證明答案一定爲Y ES,證明如下:
對於任意3個位置的字符(x1 , x2 , x3 ),可進行如下變化:
(x1 , x2 , x3 ) → (x1 , x3 + 1, x2 + 1) → (x2 + 2, x3 + 1, x1 + 1) → (x2 +
2, x1 + 2, x3 + 2) → (x1 + 3, x2 + 3, x3 + 2).(記爲變化方式1)。
在變化方式1的基礎上,再將這3個位置的字符兩兩各交換12次,即
得(x1 + 3 + 12 + 12, x2 + 3 + 12 + 12, x3 + 2 + 12 + 12)即(x1 + 27, x2 +
27, x3 + 26)(記爲變化方式2)。
又 一 共 只 有26個 小 寫 字 母 , 所 以 變 化 方 式 2 等 同 於(x1 , x2 , x3 ) →
(x1 + 1, x2 + 1, x3 )。即保證了不改變字符位置順序的情況下對兩
個字符進行了+1操作。
所以每次我們只需任選和S2 該位置不相同的兩個位置的字符進行變化
方式2的操作,那麼最後要麼S1 完全變爲S2 ,要麼S1 和S2 只有一個位
置的字符不相同,對於只有一個位置字符不相同的情況,因爲字符串
奇偶性相同,所以可進行變化1的操作使得該位置的差值平攤到另外
兩個位置,再對這另外兩個位置進行變化2的操作即得到了S2

 

#include <iostream>
#include <string>
using namespace std;

string s1, s2;
bool f()
{
	for (int i=0;i<26;++i)
	{
		if (s1[0]==s2[0] && s1[1]==s2[1])
		return true;
		swap(s1[0], s1[1]);
		s1[0]++, s1[1]++;
		if (s1[0]>'z') s1[0] = 'a';
		if (s1[1]>'z') s1[1] = 'a';
	}
	return false;
}

int main()
{
	int t, i, j, k, l, n, m, c = 0;
	scanf("%d", &t);
	while (t--)
	{
		cin>>s1>>s2;
		printf("Case #%d: ", ++c);
		l = s1.length();
		n = m = 0;
		if (l>2)
		{
			for (i=0;i<l;++i)
			{
				n += s1[i];
				m += s2[i];
			}
			if ((n&1) == (m&1)) printf("YES\n");
			else printf("NO\n");
		}
		else
		{
			if (f()) printf("YES\n");
			else printf("NO\n");
		}
	}
	return 0;
}
		

	
	


 

 

 

 

 

發佈了58 篇原創文章 · 獲贊 9 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章