pat 甲級 1093(邏輯題)
阿新 • • 發佈:2018-11-18
題目連結:
思路:
(1)要找PAT的數量,先找到A在找到A前面P的個數c1,再找出A後面T的個數c2,
就能求出這個A構成的pat的個數,就是c1*c2;
(2)優化:先找出所有T的個數,然後每次遇到一個T就減少1,遇到一個P就+1,遇到A就已經知道
A前面的P和A後面的T。
(3)反思:一開始想用暴力,後來暴力不行就像找到p,在找P後面的A在找到A後面的T,但是時間超限了。
想想就三個,找到中間的就行了。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long LL; const LL MOD = 1000000007; LL ans,c1,c2; char a[100010]; int main(void) { scanf("%s",a); int j,len=strlen(a),i; for(c1=0,i=0;i<len;i++) if(a[i]=='T') c1++; for(c2=0,i=0;i<len;i++) { if(a[i]=='T') c1--; if(a[i]=='P') c2++; if(a[i]=='A') ans=(ans+c1*c2%MOD)%MOD; } printf("%lld\n",ans); return 0; }