1040 有幾個PAT 25分

2021-10-03 23:58:56 字數 1410 閱讀 7520

思路分析一:此題如果直接暴力會超時,所以應該找到規律。通過觀察輸出結果其實就是對於乙個確定位置的a來說,其左邊p的個數乘以其右邊的t的個數。那麼接下來的工作就是統計確定位置a左邊的p的個數。可以設定乙個資料leftnump,記錄p的個數。如果當前位i是p,那麼leftnump[i]++,否則,leftump[i[就繼承上一位的結果。現在統計t的個數,並在遇到a時輸出結果。從右往左遍歷,如果遇到t,則numt++;,當遇到a時,輸出結果:leftnump[i]乘以numt。然後累加

#include

#include

#include

using

namespace std;

const

int maxn=

100010

;const

int mod=

1000000007

;char str[maxn]

;int leftnump[maxn]=;

intmain()

if(str[i]

=='p')}

int ans=

0,rightnumt=0;

for(

int i=len-

1; i>

0; i--

)//從右往左遍歷統計t的個數,直到遇到第乙個a

else

if(str[i]

=='a')}

printf

("%d\n"

,ans)

;return0;

}

思路分析二:整體規律與思路一相同,只不過計算最後的結果稍有差別。先遍歷整個陣列,統計出所有t的個數,然後numt++;然後再遍歷陣列,如果遇到p,則nump++;遇到t,則numt–(即a前面的t是無效t);遇到a就可以輸出結果了nump乘以numt

***注意取餘!***

#include

#include

#include

using

namespace std;

const

int maxn=

100010

;const

int mod=

1000000007

;char str[maxn]

;int leftnump[maxn]=;

intmain()

int ans=

0,nump=0;

for(

int i=

0; i(str[i]

=='t')if

(str[i]

=='a')}

printf

("%d\n"

,ans)

;return0;

}

1040 有幾個PAT 25 分

現給定字串,問一共可以形成多少個pat?輸入只有一行,包含乙個字串,長度不超過10 5 只包含p a t三種字母。在一行中輸出給定字串中包含多少個pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。2 includeusing namespace std int countp ...

1040 有幾個PAT 25 分

現給定字串,問一共可以形成多少個pat?輸入格式 輸入只有一行,包含乙個字串,長度不超過10 5 只包含p a t三種字母。輸出格式 在一行中輸出給定字串中包含多少個pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。輸入樣例 輸出樣例 2一開始的思路是以p為結點找每個p後面有...

1040 有幾個PAT 25分

現給定字串,問一共可以形成多少個pat?輸入只有一行,包含乙個字串,長度不超過10 5 只包含p a t三種字母。在一行中輸出給定字串中包含多少個pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。我新增了一部分除錯輸出,繼而明白了 一丟丟吧,其實查詢pat,當且僅當找到p,再...