PAT乙級1040題解

2021-10-19 18:21:48 字數 918 閱讀 3789

現給定字串,問一共可以形成多少個 pat?

輸入格式:

輸入只有一行,包含乙個字串,長度不超過10的​5次方​​ ,只包含 p、a、t 三種字母。

輸出格式:

在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。

輸出樣例:

2本題最直接的解法就是三重迴圈遍歷,但是顯然時間複雜度過高,必定超時。對於本題,時間複雜度為n的三次方和n的平方都會超時,因為資料過大了。正確解法時間複雜度應為o(n)。我也是參考了很多大佬的解法才得以解決本題。

本題要求我們查詢pat的個數,顯然我們不能乙個乙個去找(三重迴圈就是如此)這樣效率太低了,我們可以通過字元個數的乘積來獲取。假如題目不要求順序,p,a,t三種字元的個數的乘積就是結果,而題目要求必須按照pat的順序,那麼我們就要設定乙個字母為標桿用來約束順序,顯然p與t不能作為標桿,因為若p為標桿,我們無法保證a與t的順序,t同理,所以我們把a設定為標桿,這樣可以確保a的前面為p,a的後面為t,也就約束了順序。

我們可以先定義三個字母的計數器,用乙個迴圈遍歷字串,獲取t的個數,再建立乙個迴圈遍歷,若遍歷到p,p計數器+1,遍歷到t,t計數器-1(保證t在a後面),遍歷到a,就將p與t的計數器相乘再取餘1000000007,並加入sum。這樣迴圈結束,sum即為所有pat的個數。輸出即可。

注意因為兩個計數器的乘積顯然是很可能大於int,所以要再次取餘。

#include

using

namespace std;

intmain()

for(

int i =

0; i < str.

size()

; i++

) cout << sum;

return0;

}

PAT乙級 1040 有幾個PAT

現給定字串,問一共可以形成多少個 pat?輸入格式 本來是說從pat甲級再開始記錄做題記錄的,但是難度明顯高於我自己的想象,所以現在在乙級題中,覺得特別有價值的需要來記錄一下。自己的 如下 include define m 1000000007 include using namespace std...

PAT 乙級 1040 有幾個PAT

題目 題目鏈結 思路 這道題的思路是從網上搜的,要想知道構成多少個pat,那麼遍歷字串後對於每一a,它前面的p的個數和它後面的t的個數的乘積就是能構成的pat的個數。然後把對於每乙個a的結果相加即可。辣麼就簡單啦,只需要先遍歷字串數一數有多少個t,然後每遇到乙個t呢cntt 每遇到乙個p呢,cntp...

PAT乙級 1040 有幾個PAT

題目 1040 有幾個pat 原先思路自己也知道肯定會超時,還是寫了,畢竟時間複雜度o n3 比較直觀找到每個pa,檢視後續有多少個t,求和。正確思路 看了下大佬的思路,是看每個a前的p和後的t的積,豁然開朗,修改了自己的 全部通過。include using namespace std intma...