研究寻找规律。对于每一个 A ,当它的左边有 P 且右边有 T 时便可以组成 PAT 。而当左边有多个 P ,且右边有多个 T 时,可以组成的集合便是两个集合的笛卡儿积,可以组成的数量是左边的 P 和右边的 T 数量的乘积。即对于一个确定位置的 A ,它可以形成的 PAT 数量等于左边 A 个数和右边 T 个数的乘积。
如何较快地获取每一位左边 P 的个数呢?可以遍历数组,并将左边 P 的数量存储于另一个数组之中。同理, 每一位右边 T 的数量也可以用这个方法很快得到。
intmain(){ int i, n, num; char str[100010]; scanf("%s", str); n = strlen(str); int *p = (int *)calloc(sizeof(int), n); int *t = (int *)calloc(sizeof(int), n);
num = 0; for (i = 0; i < n; i++){ //统计每一位左边有几个P p[i] = num; if (str[i] == 'P') num++; } num = 0; for (i = n - 1; i >= 0; i--){ //统计每一位右边有几个T t[i] = num; if (str[i] == 'T') num++; } num = 0; for (i = 0; i < n; i++){ if (str[i] == 'A'){ num = (num + p[i] * t[i]) % 1000000007; } } printf("%d", num); }