csust-8..5早训CF之800-1600分

本文精选了CodeForces平台上的六道竞赛题目,包括朋友聚会、菲利亚的家庭作业、索尼亚的查询、疯狂的计算机、完成单词及加法与平方根,提供了详细的C++代码实现与解题思路,适合算法竞赛爱好者学习与参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

A - Meeting of Old Friends

B - Filya and Homework

C - Sonya and Queries

D - Crazy Computer

E - Complete the Word

F - Plus and Square Root


A - Meeting of Old Friends

 CodeForces - 714A 

题目链接https://codeforces.com/problemset/problem/714/A

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
const int inf = 1e8 + 10;
#define ll long long
int main()
{
	ll a, b, c, d, k;
	cin >> a >> b >> c >> d >> k;
	if (a > c) swap(a, c);
	if (b > d) swap(b, d);
	ll ans = 0;
	if (b - c < 0) cout << "0" << '\n';
	else {
		ans = b - c + 1;
		if (k >= c && k <= b) ans--;
		cout << ans << endl;;
	}
	return 0;
}

B - Filya and Homework

 CodeForces - 714B 

题目链接https://codeforces.com/problemset/problem/714/B

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
const int inf = 1e8 + 10;
#define ll long long
int a[mac];
int main() {
	int n;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	sort(a + 1, a + 1 + n);
	if (a[1] == a[n]) {
		printf("YES\n");
		return 0;
	} 
	else {
		int p = -1, nb = 0, a1 = -1, a2 = -1, a3 = -1;
		for (int i = 1; i <= n; i++) {
			if (a[i] != p) {
				nb++, p = a[i];
				if (a1 < 0) a1 = a[i];
				else if (a2 < 0) a2 = a[i];
				else a3 = a[i];
			}
		}
		if (nb > 3) printf("NO\n");
		else {
			if(nb < 3 ||(nb == 3 && a3 - a2 == a2 - a1))
				cout << "YES" ;
			else {
				cout << "NO";
			}
		}
	}
	return 0;
}

C - Sonya and Queries

 CodeForces - 714C 

题目链接https://codeforces.com/problemset/problem/714/C

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
char s[50], ss[10];
int vis[1 << 20];
int main()
{
	int n;
	scanf("%d", &n);
	while (n--) {
		scanf("%s%s", ss, s);
		if (ss[0] == '+') {
			int len = strlen(s);
			int sum = 0;
			for (int i = 0; i < len; i++) {
				if (s[i] & 1)  sum = sum << 1 | 1;
				else sum = sum << 1;
			}
			vis[sum]++;
		}
		else if (ss[0] == '-') {
			int len = strlen(s);
			int sum = 0;
			for (int i = 0; i < len; i++) {
				if (s[i] & 1)  sum = sum << 1 | 1;
				else sum = sum << 1;
			}
			vis[sum]--;
		}
		else {
			int len = strlen(s);
			int sum = 0;
			for (int i = 0; i < len; i++) {
				if (s[i] & 1)  sum = sum << 1 | 1;
				else sum = sum << 1;
			}
			printf("%d\n", vis[sum]);
		}
	}
	return 0;
}

D - Crazy Computer

 CodeForces - 716A 

题目链接https://codeforces.com/problemset/problem/716/A

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
const int inf = 1e8 + 10;
#define ll long long
int a[mac];
int main()
{
	int n,m; 
	scanf("%d%d", &n,&m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
	}
	if (n==1) {
		printf ("1\n");
		return 0;
	}
	int ans=1;
	int x=1;
	for (int i=2; i<=n; i++){
		if (a[i]-a[i-1]>m) x=i;
	}
	ans=n-x+1;
	printf ("%d\n",ans);
	return 0;
}

E - Complete the Word

 CodeForces - 716B 

题目链接https://codeforces.com/problemset/problem/716/B

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
const int inf = 1e8 + 10;
#define ll long long
char s[mac];
int vis[mac];
int main()
{
	scanf("%s", s);
	int len = strlen(s);
	if (len < 26) printf("-1\n");
	else {
		int mark = -1, tail = 0;
		for (int i = 0; i < len; i++) {
			if (mark!=-1) break;
			if (s[i] != '?') {
				vis[s[i] - 'A']++;
				while (vis[s[i] - 'A'] > 1) {
					vis[s[tail] - 'A']--;
					tail++;
				}
			}			
			if (i - tail + 1 == 26 ) mark = tail;
		}
		if (mark == -1) {
			printf("-1\n"); return 0;
		}
		for (int i = 0; i < len; i++) {
			if (i == mark) {
				for (int j = i; j < i + 26; j++) {
					if (s[j] == '?') {
						for (int k = 0; k < 26; k++) {
							if (!vis[k]) {
								printf("%c", 'A' + k);
								vis[k] ++; break;
							}
						}
					}
					else printf("%c", s[j]);
				}
				i += 26;
			}
			if (i >= len) {
				printf("\n"); return 0;
			}
			if (s[i] == '?') printf("A");
			else printf("%c", s[i]);
		}
		printf("\n");
	}
	return 0;
}

F - Plus and Square Root

 CodeForces - 716C 

题目链接https://codeforces.com/problemset/problem/716/C

#include <bits/stdc++.h>
using namespace std;
const int mac = 1e5 + 10;
const int inf = 1e8 + 10;
#define ll long long
char s[mac];
int vis[mac];
int main()
{
	int n;
	ll ans = 0, stp = 0, now = 2, lev = 1;
	scanf("%d", &n);
	for (ll i = 1; i < n + 1; i++) {
		if (i == 1) printf("2\n");
		else {
			ans = i * (i + 1) * (i + 1) - (i - 1);
			printf("%lld\n", ans);
		}
	}
	return 0;
}

 

<think>嗯,用户需要实现一个注册功能,检查各种输入是否合法,用正则表达式处理。首先得确认每个输入项的规则:用户名、密码、邮箱和QQ号。 用户名的要求是字母、数字和下划线,6到8个字符。正则表达式应该是^[\w]{6,8}$,不过要注意下划线是否被包含在\w里,是的,\w包括字母、数字和下划线。所以这个正则应该没问题。 密码只能是字母,4到8个字符,而且两次输入必须相同。这里可能需要开检查两次输入是否一致,还有密码是否符合正则表达式^[a-zA-Z]{4,8}$。如果用户第一次输入包含非字母字符,要提示错误,重新输入。比如例子中的第一次输入“Lucy_hoo”包含下划线,所以不符合,必须重新输入到“pretty”才正确。 邮箱的规则比较复杂,用户名部是字母、数字和下划线,然后@后面是一级域名,由字母数字组成,然后是点号和二级域名,2到4位的字母数字。正则表达式应该是^[\w]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]{2,4}$。不过可能需要更严格一点,比如一级域名不能有特殊符号,二级域名只能是字母?例子中的Hmf@csust.edu符合,因为csust是一级域名,edu是二级,长度3位,符合2-4位的要求。 QQ号要求4-11位数字,首位不能为0。正则应该是^[1-9]\d{3,10}$,第一位是1-9,后面有3到10位数字,总长度4-11位。例如输入Hmf@csust.edu会被提示错误,正确输入123456符合条件。 接下来是Java代码实现。需要用Scanner获取输入,循环直到输入正确。每个输入项需要循环验证,直到符合正则表达式。比如用户名输入错误时,提示并重新输入。密码需要输入两次,且两次一致,同时符合字母要求。邮箱和QQ同样处理。 需要注意的是,处理密码时,第一次输入可能不符合规则,比如包含其他字符,这时候要提示错误,并让用户重新输入,直到正确。然后再次输入密码,检查是否一致。 另外,正则表达式在Java中需要用双反斜杠转义,比如\\w。所以在代码里写的时候要注意转义字符的问题。 测试用例的话,用户提供的例子可以作为参考,确保各个条件都被覆盖。比如用户名长度是否在6-8之间,密码是否两次一致,邮箱的格式是否正确,QQ号的首位是否为非零数字等。 可能遇到的错误包括正则表达式写错,比如邮箱部的正则可能没有考虑到域名的正确结构,或者QQ号的正则没有正确限制首位。需要仔细检查每个正则是否符合要求。 最后,输出注册信息时要确保所有输入项都验证通过,然后输出各个字段的值。代码结构上,每个输入项单独处理,用循环和正则匹配来验证,直到输入正确为止。</think>以下是实现注册功能并验证用户输入的Java代码,包含正则表达式验证和交互式输入处理: ```java import java.util.Scanner; import java.util.regex.Pattern; public class UserRegistration { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 用户名验证(字母、数字、下划线,6-8位) String username = getValidInput(scanner, "用户名(字母、数字和下划线)6-8个字符:", "^\\w{6,8}$", "用户名格式错误,请重新输入!"); // 密码验证(字母,4-8位,两次一致) String password = getPassword(scanner); // 邮箱验证(正则表达式验证) String email = getValidInput(scanner, "邮箱:", "^\\w+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]{2,4}$", "邮箱格式错误,请重新输入!"); // QQ号验证(4-11位数字,首位非零) String qq = getValidInput(scanner, "QQ:", "^[1-9]\\d{3,10}$", "输入的QQ格式错误\n请输入QQ(4-11位的数字,首位不能为0):"); // 输出注册信息 System.out.println("\n注册用户信息为:"); System.out.println("用户名: " + username); System.out.println("密码: " + password); System.out.println("email: " + email); System.out.println("QQ: " + qq); scanner.close(); } private static String getValidInput(Scanner scanner, String prompt, String regex, String errorMsg) { while (true) { System.out.print(prompt); String input = scanner.nextLine().trim(); if (Pattern.matches(regex, input)) { return input; } System.out.println(errorMsg); } } private static String getPassword(Scanner scanner) { String password; String confirmPwd; while (true) { System.out.print("密码(只能是字母)4-8个字符:"); password = scanner.nextLine().trim(); if (!Pattern.matches("^[a-zA-Z]{4,8}$", password)) { System.out.println("密码只能由字母组成,且为4-8位"); continue; } System.out.print("请再次输入密码:"); confirmPwd = scanner.nextLine().trim(); if (password.equals(confirmPwd)) { return password; } System.out.println("两次输入的密码不一致,请重新输入!"); } } } ``` ### 功能说明: 1. **用户名验证**(正则表达式 `^\\w{6,8}$`) - 允许字母、数字、下划线 - 长度严格限制6-8位 2. **密码验证**(正则表达式 `^[a-zA-Z]{4,8}$`) - 仅允许英文字母 - 双重验证:格式校验 + 两次输入一致性检查 3. **邮箱验证**(正则表达式 `^\\w+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]{2,4}$`) - 用户名部:字母/数字/下划线 - 域名部:一级域名(字母数字)+ 二级域名(2-4位字母数字) 4. **QQ号验证**(正则表达式 `^[1-9]\\d{3,10}$`) - 首位不能为0 - 总长度4-11位 ### 运行示例: ``` 用户名(字母、数字和下划线)6-8个字符:Lucy_hoo 密码(只能是字母)4-8个字符:Lucy_hoo 密码只能由字母组成,且为4-8位 请输入密码:pretty 请再次输入密码:pretty 邮箱:Hmf@csust.edu QQ:Hmf@csust.edu 输入的QQ格式错误 请输入QQ(4-11位的数字,首位不能为0):123456 注册用户信息为: 用户名: Lucy_hoo 密码: pretty email: Hmf@csust.edu QQ: 123456 ``` ### 关键设计: 1. **输入复用机制**:`getValidInput()` 方法封装了输入验证逻辑,支持任意正则表达式验证 2. **正则表达式优化**: - 用户名:`\\w` 匹配字母/数字/下划线 - 邮箱:严格的段验证避免常见格式错误 3. **密码双重验证**:独立设计`getPassword()`方法处理两次输入比对 4. **错误提示友好性**:所有错误输入都会给出明确的格式要求说明 --- **扩展建议**: 1. 可以添加`PasswordHelper`类实现密码强度检查 2. 使用`Map`存储错误信息实现多语言支持 3. 集成数据库操作实现真正的用户存储功能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值