Atcoder - 162D 枚举

<Atcoder - 162D> 枚举

https://atcoder.jp/contests/abc162/tasks/abc162_d

题意:

给定一个只由字符 'B','G','R' 组成的一个串S,求满足下列条件的三元组{Si,Sj,Sk}的个数:

(1) Si != Sj && Si != Sk && Sj != Sk

(2) j - i != k - j

思路:

先把字符串转化成数字串(B =>1,G => 2,R => 3),为了方便操作。分别记B G R的个数为cnt[1],cnt[2],cnt[3],这样能产生的满足条件(1)的三元组个数共有cnt[1] * cnt[2] * cnt[3]个,然后我们写一个chk函数,枚举所有满足条件(1)但是不满足条件(2)的三元组,即看传入的三元组是否相邻的两个元素间距相等。我们先将1,2,3对应的位置放进vector内,这样不断枚举三元组内第一个元素的位置,然后第二层循环枚举距离,在不越界串长度的条件下,看如果当前枚举的首个数字的位置加上一倍距离和二倍距离是否分别是剩下的两个数字。三元组一共就6种情况:123、132、213、231、312、321,分别用chk加工这6个串,然后用cnt[1] * cnt[2] * cnt[3]减去这些不合法的即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxx = 4e3 + 7;
int n;
char s[maxx];
int num[maxx];
vector <int> vec[maxx];
LL cnt[maxx];
bool vis[maxx];

LL chk(int a, int b, int c) {
	LL res = 0;
	for(int i = 0; i < vec[a].size(); i++) { //枚举首字母位置
		for(int j = 1; vec[a][i] + 2 * j <= n; j++) { //枚举间距
			if(num[vec[a][i] + j] == b && num[vec[a][i] + 2 * j] == c) res++;
		}
	}
	return res;
}

int main() {
	scanf("%d", &n);
	scanf("%s", s + 1);
	for(int i = 1; i <= n; i++) {
		if(s[i] == 'B') num[i] = 1;
		else if(s[i] == 'G') num[i] = 2;
		else if(s[i] == 'R') num[i] = 3;
	}
	for(int i = 1; i <= n; i++) {
		vec[num[i]].push_back(i);
		cnt[num[i]]++;
	}
	LL ans = cnt[1] * cnt[2] * cnt[3];
	ans -= chk(1, 2, 3) + chk(1, 3, 2) + chk(2, 1, 3) + chk(2, 3, 1) + chk(3, 1, 2) + chk(3, 2, 1);
	printf("%lld\n", ans);
	return 0;
}
<think>好的,我现在需要帮助用户解决在MyBatis-Plus中配置枚举类型解析器的问题。首先,我需要回顾一下用户提供的引用内容,确保答案准确。 用户提到了引用[2],里面提到MyBatis-Plus简化了枚举映射。引用[4]详细说明了如何配置枚举处理,包括配置文件中的typeEnumsPackage和Jackson的序列化设置。另外,引用[5]提到注解的使用场景,可能与@EnumValue相关。 首先,我需要确认MyBatis-Plus处理枚举的几种方式。默认情况下,MyBatis-Plus使用MybatisEnumTypeHandler(引用[1]和[4]),这个处理器会调用枚举的name()方法。但如果需要存储其他值,比如自定义的code,需要使用@EnumValue注解标记字段,并在配置中指定枚举包路径。 然后,步骤应该包括:1. 添加注解到枚举类,2. 配置typeEnumsPackage,3. 可选地处理JSON序列化。用户可能还需要示例代码,比如枚举类的定义和配置文件的修改。 另外,用户可能遇到的常见问题,比如Jackson默认使用枚举的name(),所以需要配置WRITE_ENUMS_USING_TO_STRING,使其调用toString方法,而toString需要返回数据库存储的值。这部分在引用[4]中有说明,需要包含在回答中。 确保步骤清晰,分点说明,并给出代码示例。同时,根据用户提供的引用,正确标注引用标记,比如在配置typeEnumsPackage时引用[4],在提到默认处理器时引用[1]和[2]。 最后,生成相关问题,这些问题应该围绕枚举配置的扩展,比如处理复杂枚举、与Jackson的整合、常见错误等。</think>### 如何在MyBatis-Plus中配置枚举类型解析器 #### 1. **理解MyBatis-Plus的枚举处理机制** MyBatis-Plus通过`DefaultEnumTypeHandler`默认将枚举的`name()`值映射到数据库字段。若需存储自定义值(如数字、字符串),需通过注解和配置实现[^2][^4]。 #### 2. **定义枚举类并添加注解** 在枚举类中,使用`@EnumValue`标记需要存储到数据库的字段: ```java public enum SexEnum { MALE(1, "男"), FEMALE(2, "女"); @EnumValue // 标记此字段为数据库存储值 private final int code; private final String desc; SexEnum(int code, String desc) { this.code = code; this.desc = desc; } } ``` #### 3. **配置枚举包路径** 在`application.yml`中指定枚举类所在包,使MyBatis-Plus自动扫描: ```yaml mybatis-plus: typeEnumsPackage: com.example.enums # 替换为实际包路径 ``` #### 4. **修改默认枚举处理器(可选)** 若需全局使用自定义处理器,可覆盖默认配置: ```yaml mybatis-plus: configuration: default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler[^1] ``` #### 5. **处理JSON序列化问题** Spring Boot集成Jackson时,需配置枚举序列化方式以匹配数据库值: ```java @Bean public Jackson2ObjectMapperBuilderCustomizer enumCustomizer() { return builder -> builder.featuresToEnable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING); } ``` 在枚举类中重写`toString()`方法返回`code`值: ```java @Override public String toString() { return String.valueOf(this.code); } ``` 此配置确保接口返回与数据库存储值一致[^3]。 #### 6. **验证映射结果** 最终数据库字段将存储`code`值(如1、2),而非枚举名称(MALE/FEMALE)。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值