思路分析一:此題如果直接暴力會超時,所以應該找到規律。通過觀察輸出結果其實就是對於乙個確定位置的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,再...