题目
字符串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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <stdio.h>
int p[100010] = {0}; int a[100010] = {0}; int t[100010] = {0}; int z[100010] = {0}; int x[100010] = {0};
int main(void) { int c; int len = 0; int count = 0; int psize = 0, asize = 0, tsize = 0;
while ((c = getchar()) != EOF && c != '\n') { switch (c) { case 'P' : p[psize++] = len; break; case 'A' : a[asize++] = len; break; case 'T' : t[tsize++] = len; break; } ++len; }
for (int i = 0, tmpj = 0; i < asize && tmpj < tsize; ++i) { for (int j = tmpj; j < tsize; ++j) { if (a[i] < t[j]) { z[i] = tsize - j; tmpj = j; break; } } } for (int i = asize - 1, tmp = 0; i >= 0; --i) { tmp += z[i]; x[i] = tmp; } for (int i = 0, tmpj = 0; i < psize && tmpj < asize; ++i) { for (int j = tmpj; j < asize; ++j) { if (p[i] < a[j]) { count += x[j]; count %= 1000000007; tmpj = j; break; } } } printf("%d\n", count);
return 0; }
|