PAT 乙级 1040 有几个PAT
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT
?
输入格式:
输入只有一行,包含一个字符串,长度不超过10^5,只包含 P、A、T 三种字母。
输出格式:
在一行中输出给定字符串中包含多少个PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
总结:
/* 本题的解法非常类似"在线处理"的思想. 观察下面3段字符串: PA (只能组成1个PA) PAPA (第一个A能组成1个PA, 第2个A能组成2个PA(=该A前P的个数), 一共1+2=3个PA) PAPAPA (1 + 2 + 3 = 6个PA) 现在我们看一下PAPAATTPATTT这个字符串, 我们不要一开始就盯着PAT这 3个字符, 而是先看字符串里有多少P, 再看有多少PA, 最后确定有多少PAT. 从左到右一个一个字符的看, 下面我给字符串标上号 PAPAATTPAT T T 0123456789 10 11 走到下标0, P=1, PA=0, PAT=0 走到下标1, P=1, PA=1, PAT=0 走到下标2, P=2, PA=1, PAT=0 走到下标3, P=2, PA=1+2=3, PAT=0 走到下标4, P=2, PA=3+2=5, PAT=0 走到下标5, P=2, PA=5, PAT=5 走到下标6, P=2, PA=5, PAT=5+5=10 走到下标7, P=3, PA=5, PAT=10 走到下标8, P=3, PA=5+3=8, PAT=10 走到下标9, P=3, PA=8, PAT=10+8=18 走到下标10, P=3, PA=8, PAT=18+8=24 走到下标0, P=3, PA=8, PAT=24+8=34 寥寥10几行搞定, 思想太重要了. 注意取余数是在中间过程就取, 不用等到最后总数再取余. */ // #include <iostream> #include <cstdio> #define MOD 1000000007 // using namespace std; const int maxn = 100010; int main() { char str[maxn]; while(~scanf("%s", str)) { long long p = 0, pa = 0, pat = 0; //P PA PAT 的个数 for(int i = 0; str[i]; ++i) { if(str[i] == 'P') ++p; if(str[i] == 'A') pa = (pa + p) % MOD; if(str[i] == 'T') pat = (pat + pa) % MOD; } printf("%lld\n", pat); } // system("pause"); return 0; }
Less interests,more interest!