1040. 有几个PAT(25)
字符串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
分析:
这道题目的关键就在于怎么算得快,枚举法肯定是不行的。我用的算法是:
(1)标记P出现的序号;
(2)每遇到一个A,将当前P标记的数赋给A,表示这个A之前有多少个P
(3)每遇到一个T,计算之前A之前的P的总数,这就是这个T能组成的PAT字符串的数量;
(4)将这个数量加和。
这样就快的飞起啦~~
using System; using System.Collections.Generic; namespace PAT { class Program { static void Main() { string input = Console.ReadLine(); int length = input.Length; int countP = 0; long sum = 0; long beforeSum = 0; List<int> countA = new List<int>(); foreach(char ch in input) { if (ch == 'P') countP++; else if (ch == 'A') countA.Add(countP); else { foreach (int item in countA) { beforeSum += item; } sum += beforeSum; countA = new List<int>(); } } Console.Write(sum % 1000000007); } } }