本題鏈結
現給定字串,問一共可以形成多少個 pat?
輸入格式:
輸入只有一行,包含乙個字串,長度不超過105 ,只包含 p、a、t 三種字母。
輸出格式:
在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。
輸入樣例:
輸出樣例:
2
對於字串中的每乙個a
,計算它左邊的p
的數量乘以它右邊的t
的數量,把所有這樣的乘積相加即為所求,記得對1000000007
取餘數。
怎麼降低時間複雜度呢?在對字串的遍歷中,定義leftp
為當前字元左側的p
的數量,初始值為0
,rightt
為當前字元左側的t
的數量,初始值需要提前統計一遍。
在遍歷過程中:
當前字元為p
,++leftp
;
當前字元為t
,--rightt
;
當前字元為a
,累加leftp * rightt
,每累加一次就取模,防止溢位。
#include
#define max 100010
#define magic 1000000007
typedef
long
long ll;
ll countchar
(char
*str,
char x)
return ret;
}int
main()
++p;
}printf
("%lld"
, ans)
;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...