icpc:problems:usaco23open_pareidolia_s
目录
problems | |
---|---|
名称 | Pareidolia S |
题目编号 | USACO23OPEN_S3 |
题目链接 | luogu.com.cn/… |
来源 | USACO |
算法分类 | 动态规划, 线性动态规划 |
难易程度 | 一般般 |
Pareidolia S
想法
设定状态F[x],表示以x为结尾的所有子串的B函数的和。F[x]分为两部分,第一部分为包含最后一个Bessie的子串带来的B函数的和;第二部分为最后一个Bessie之前的子串中的Bessie产生的B函数的和。
假设最后一个Bessie的最后一个e在sit[6]位置上。
- F[x]第一部分:由最后一个Bessie产生sit[6]个子串的个数这些子串分别为[1,x],[2,x],[3,x]…[sit[6],x],这些子串均包含最后一个Bessie,产生了sit[6]个数。
- F[x]第二部分:在最后一个Bessie之前已有的Bessie个数和,由于包含了位置x,故为新的子串,产生了新的B函数的值。值为F[sit[6]-1]。
最后统计每个位置上的F[x]即可。
代码实现
#include<cstdio> #include<cstring> const int N = 3*1e5+10; char line[N]; int F[N], sit[10]; int main() { scanf("%s", line+1); int len = strlen(line+1); for(int i = 1; i <= len; i++) { if(line[i] == 'b') sit[1] = i; else if(line[i] == 'i') sit[5] = sit[4]; else if(line[i] == 's') { sit[4] = sit[3]; sit[3] = sit[2]; } else if(line[i] == 'e') { sit[2] = sit[1]; sit[6] = sit[5]; } F[i] = F[sit[6] - 1] + sit[6]; } long long int ans = 0; for (int i = 1; i <= len; ++i) { ans += F[i]; } printf("%lld", ans); return 0; }
/app/www/public/data/pages/icpc/problems/usaco23open_pareidolia_s.txt · 最后更改: 2023/05/24 11:15 由 温婕莺