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);
}
}
}