1003 我要通過! 20 分

2022-06-09 11:33:12 字數 1554 閱讀 7031

題意

題目給出乙個字串,可能有p、a、t或其他字元。現在需要根據以下幾個條件來判斷該字串能否輸出「yes」。

條件1:如果出現p、a、t以外的字元,輸出「no」;初始狀態下p和t必須各恰好有乙個,且p在t左邊,p和t之間至少有乙個a,否則輸出「no」。

條件2:pat、apata、aapataa、aaapataaa、... 、xpatx都輸出「yes",這裡x為空或是任意數量的a。

條件3:假設有乙個字串的格式是apbtc,這裡a、b、c可以為空或是任意數量的a,例如pat、apaat、aaapta都滿足這個格式。如果這個字串apbtc已知是yes,那麼在b與t之間新增乙個a、c後面新增字串a之後形成的新字串apbatca也是yes。例如pat是yes,那麼paat也是yes;paat是yes,那麼paaat也是yes;apata是yes(因為滿足條件2),那麼apaataa也是yes。

現在讓你通過這三個條件來判斷輸入的字串是否應該輸出「yes」。

思路思考這三個條件,可以注意到:條件2給出的字串是最底層yes的,且條件2的p與t中間有且只有乙個a,而由條件3得到的所有字串一開始一 定是條件2中的字串變形而來。

如圖所示,所有yes最開始都源於條件2,條件3是在條件2的基礎上進行的擴充。對每乙個滿足條件2的字串,都可以由條件3乙個接乙個生成新的字串,並且這也是生成新的yes字串的唯一方法, 即在pt中間加乙個a,在字串後面加上p前面的所有a。

由此可以得到靈感:對給出的字串,先判斷其是否通過條件1的檢驗。之後,記錄p左邊a的個數為x、p和t中間a的個數為y. t右邊a的個數為z。考慮到條件3得到新字串的過程是在pt中間加乙個a、字串後面加上p前面的所有a,因此可以知道,每使用條件3一次,x不變、y變為y+ 1、z變為z+x。反過來,如果沿著箭頭逆回去,每逆一次,x不變、y變為y-1、z變為z-x。這樣可以一直逆回去,直到y==1時(即p和t中間只有乙個a時)判斷x和z是否相等:如果x=z。則輸出「yes";否則,輸出「no」。

總的來說,就是對初始字串通過條件3的逆運算不斷回退,直到可以判斷條件2是否成立。

講到這裡,這題已經很好做了。但是如果進一步分析可以發現一些規律,從而更快解出答案:

這裡x、y、z的含義和上面一樣,由於y每次回退的步驟中都減1,因此從初始字串回退到pt之間只剩乙個a,需要進行y-1次回退。而t右邊a的個數z在經過y-1次回退後(z每次減x)將變為z-x * (y-1)。這時,判斷條件2成立的條件是z-x * (y-1)是否等於p左邊a的個數x(因為條件2中p左邊和t右邊的a的個數是相等的,且在回退的過程中x不發生變化):如果z-x * (y-1) == x,則輸出「yes";否則,輸出「no」。

所以一句話總結字串的要求:只能有乙個p乙個t,中間末尾和開頭可以隨便插入a。但是必須滿足開頭的a的個數 * 中間的a的個數 = 結尾的a的個數,而且p和t中間不能沒有a。

bool check(string s)

//system("pause");

return 0;

}

1003 我要通過! 20 分

說實話,這道題還是很難的,我記得我第一次做的時候,題目都沒讀懂。到後來看了一遍解析之後再做,還是心有餘悸。首先三個條件 1.只包 含pat 三個字元 color1.只包含pat三個字元 1.只包含p at三個 字元所以遍歷一遍,把包含其他字元的字串直接輸出no 2.形如 xpat x的是正 確的答案...

1003 我要通過! 20分

github 不全,更新中 分析 1.首先保證p前,t後,p和t之間全都是a 2.根據題目的第二條和第三條 假如x aa 則aapataa正確 aapa ataa aa正確 aapaaa taaaaaa 正確 2個 1個 2個 2個 2個 2 2個 2個 3個 2 3個 設len1 p前a,len2...

1003 我要通過! 20分

written by 東籬下 悠然 只能有p a t 三種字元,出現別的字元即pass 只能有乙個p和乙個t 根據給出的幾個正確的樣例,分別可以得出 p和t之間可以任意加a,開頭的a的個數 中間的a的個數 結尾的a的個數,並且p和t之間不能為空串 學習 include using namespace...