璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


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]位置上。

  1. F[x]第一部分:由最后一个Bessie产生sit[6]个子串的个数这些子串分别为[1,x],[2,x],[3,x]…[sit[6],x],这些子串均包含最后一个Bessie,产生了sit[6]个数。
  2. 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 由 温婕莺