トピック
文字列に APPAPT
は2つの単語が含まれ PAT
、最初の単語は2 PAT
番目の位置( P
)、ビット4( A
)、ビット6( T
)、2番目の単語 PAT
はビット3( P
)、ビット4( A
)、6ビット( T
)です。
文字列が与えられた場合、合計で PAT
いくつ形成できますか?
入力フォーマット:
以下の文字列からなる入力一行10 510 ^ 5 。1 0 ?5 ??、のみ含まれ、、手紙の3種類。 P
A
T
出力フォーマット:
指定された文字列が1行にいくつ含まれているかを出力します PAT
。結果は比較的大きい可能性があるため、1000000007の残りを取得した結果のみが出力されます。
入力サンプル:
APPAPT
サンプル出力:
2
コード
#include<iostream>
using namespace std;
int main()
{
long long cal = 0;
long long *p=new long long[100000], * a = new long long[100000], * t = new long long[100000], i = 0;
string in="";
cin >> in;
for (i = 0; i < 100000; i++)
{
p[i] = 0;
a[i] = 0;
t[i] = 0;
}
i = 0;
while (in[i++] != '\0')
if (in[i - 1] == 'P')
p[i-1]++;
else if(in[i - 1] == 'A')
a[i-1]++;
else if(in[i - 1] == 'T')
t[i-1]++;
for (i = 99998; i >= 0; i--)
t[i] += t[i + 1];
for (i = 0; i < 100000; i++)
a[i] *= t[i];
for (i = 99998; i >= 0; i--)
a[i] += a[i + 1];
for (i = 0; i < 100000; i++)
if (p[i] != 0)
cal += p[i] *a[i];
cout << cal % 1000000007;
return 0;
}