字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
int main()
{
long long d[3];
memset(d,0,sizeof(d));
char s[1000001];
cin>>s;
for(int i=0;s[i]!='\0';i++)
{
if(s[i]=='P')
d[0]+=1;
if(s[i]=='A')
d[1]+=d[0];
if(s[i]=='T')
d[2]+=d[1];
}
if(d[2]>1000000007)
d[2]%=mod;
cout<<d[2];
}
这道题的思路是什么?让我们一起来看一下:
首先我们要理解PAT是什么意思
0 1 2 3 4 5 6
P P A A T T T
可以形成几个呢?
答案是12个
为什么?
用这种PAT顺序的例子来理解就是笛卡尔积2x2x3=12
那么我们现在细化一下
将PAT 分成P PA PAT 三个模块,我们可以定义数组D【3】,分别存放P PA PAT三个数的数量
求P,就是当S[i]=='P'时 D[0]+1
同理 PA就是 S[i]=='A'时 D[1]+D[0]
PAT 就是S[i]=='T'时 D[2]+D[1]
那么最后结果就应该是D[2]%1000000007(注意这里的数组D要用longlong定义 不然会超int范围)
那么最最最最最最最最最最最最最最最最最最最最最刺激的来了!!!!!!!!!!!!!!!!!!!!!!!!!
如果题目改成由P A T ?四种字符组成的字符串(长度10000以下) 其中?可以是P A T的任意一个,请问这时候PAT有多少呢?(cf div3 F)
我们还是跟刚开始一样 如果说没有问号
那么就是
将PAT 分成P PA PAT 三个模块,我们可以定义数组D【3】,分别存放P PA PAT三个数的数量
求P,就是当S[i]=='P'时 D[0]+1
同理 PA就是 S[i]=='A'时 D[1]+D[0]
PAT 就是S[i]=='T'时 D[2]+D[1]
那么最后结果就应该是D[2]%1000000007(注意这里的数组D要用longlong定义 不然会超int范围)
假如说 P ? T那么可能是PAT PPT PTT三种情况
这个时候就应该变成 D[0]=D[0]*3+3^k-1;
你可能很奇怪 为什么这里变成+3^k-1(3的k-1次方)呢?
原因是 一个问号有三种选择 两个问号呢?是不是3x3=9种?
那么这时候还是跟之前一样
如果遇到问号 就D[0]=D[0]*3+3^k-1;
同理 D[1]=D[1]*3+D[0]
D[2]=D[2]*3+D[1]
那么最后结果就应该是D[2]%1000000007(注意这里的数组D要用longlong定义 不然会超int范围)
此题结束!