1035. Password (20)

本文介绍了一个程序,用于检查和修改容易混淆的用户密码,通过替换容易混淆的字符(如1和l,0和O)来增强密码的可读性和安全性。

To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem is that there are always some confusing passwords since it is hard to distinguish 1 (one) from l (L in lowercase), or 0 (zero) from O (o in uppercase). One solution is to replace 1 (one) by @, 0 (zero) by %, l by L, and O by o. Now it is your job to write a program to check the accounts generated by the judge, and to help the juge modify the confusing passwords.

Input Specification:

Each input file contains one test case. Each case contains a positive integer N (<= 1000), followed by N lines of accounts. Each account consists of a user name and a password, both are strings of no more than 10 characters with no space.

Output Specification:

For each test case, first print the number M of accounts that have been modified, then print in the following M lines the modified accounts info, that is, the user names and the corresponding modified passwords. The accounts must be printed in the same order as they are read in. If no account is modified, print in one line "There are N accounts and no account is modified" where N is the total number of accounts. However, if N is one, you must print "There is 1 account and no account is modified" instead.

Sample Input 1:

3
Team000002 Rlsp0dfa
Team000003 perfectpwd
Team000001 R1spOdfa
Sample Output 1:
2
Team000002 RLsp%dfa
Team000001 R@spodfa
Sample Input 2:
1
team110 abcdefg332
Sample Output 2:
There is 1 account and no account is modified
Sample Input 3:
2
team110 abcdefg222
team220 abcdefg333
Sample Output 3:
There are 2 accounts and no account is modified


#include <iostream>
#include <string>
#include <utility>
#include <vector>

using namespace std;
int modify(char &a);
int main()
{
    int flag;
    int n;
    string name, pass;
    vector< pair<string, string> > v1;
    cin >> n;
    cin.get();
    for(int i=0; i<n; i++)
    {
        cin >> name >> pass;
        flag = 0;
        for(int j=0; j<pass.size(); j++)
        {
            if(modify(pass[j]) == 1)
                flag = 1;
        }
        if(flag)
            v1.push_back(make_pair(name, pass));
    }
    if(v1.empty())
    {
        if(n==1)
            cout << "There is " << n << " account and no account is modified";
        else
            cout << "There are " << n << " accounts and no account is modified";
    }
    else{
        cout << v1.size() << endl;
        for(int i=0; i<v1.size(); i++)
        {
            cout << v1[i].first << " " << v1[i].second << endl;
        }
    }
    return 0;
}

int modify(char &a)
{
    switch(a)
    {
        case '1' : a = '@';break;
        case '0' : a = '%';break;
        case 'l' : a = 'L';break;
        case 'O' : a = 'o';break;
        default : return 0; break;
    }
    return 1;
}


PS F:\Programmer\python\new_my_AI> cd backend PS F:\Programmer\python\new_my_AI\backend> ls 目录: F:\Programmer\python\new_my_AI\backend Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2025/11/5 17:53 models d----- 2025/11/6 9:59 routers d----- 2025/11/5 18:36 schemas -a---- 2025/11/5 17:59 325 .env -a---- 2025/11/5 17:58 888 config.py -a---- 2025/11/5 17:54 1035 database.py -a---- 2025/11/5 17:39 540 dependencies.py -a---- 2025/10/19 19:45 1838 install_deps.bat -a---- 2025/11/5 17:57 4108 jwt_handler.py -a---- 2025/11/5 17:16 1280 logger_setup.py -a---- 2025/11/5 17:45 1023 main.py -a---- 2025/10/19 18:58 283 requirements.txt PS F:\Programmer\python\new_my_AI\backend> cd models PS F:\Programmer\python\new_my_AI\backend\models> ls 目录: F:\Programmer\python\new_my_AI\backend\models Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/11/5 17:53 1978 chat.py -a---- 2025/11/5 17:51 733 department.py -a---- 2025/11/5 17:52 2417 post.py -a---- 2025/11/5 17:53 398 search.py -a---- 2025/11/5 17:51 1378 user.py -a---- 2025/11/5 17:50 544 __init__.py PS F:\Programmer\python\new_my_AI\backend\models> cd .. PS F:\Programmer\python\new_my_AI\backend> cd routers PS F:\Programmer\python\new_my_AI\backend\routers> ls 目录: F:\Programmer\python\new_my_AI\backend\routers Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/11/5 17:20 2979 api_chat.py -a---- 2025/11/5 17:43 1447 auth.py -a---- 2025/11/5 17:45 1677 chat_rooms.py -a---- 2025/11/5 17:44 2349 comments.py -a---- 2025/11/5 17:44 1097 departments.py -a---- 2025/11/5 17:47 751 posts.py -a---- 2025/11/5 17:45 1602 search.py -a---- 2025/11/6 9:59 0 __init__.py PS F:\Programmer\python\new_my_AI\backend\routers> cd .. PS F:\Programmer\python\new_my_AI\backend> cd schemas PS F:\Programmer\python\new_my_AI\backend\schemas> ls 目录: F:\Programmer\python\new_my_AI\backend\schemas Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2025/11/5 18:03 435 auth.py -a---- 2025/11/5 18:02 951 chat.py -a---- 2025/11/5 18:01 587 comment.py -a---- 2025/11/5 18:36 3777 common.py -a---- 2025/11/5 17:42 481 post.py -a---- 2025/11/5 17:41 100 user.py PS F:\Programmer\python\new_my_AI\backend\schemas> 这是我现在的项目结构 # backend/database.py from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker from sqlmodel import SQLModel from contextlib import asynccontextmanager from config import settings import asyncio # 从 models 包导入所有表模型 from models import * # 创建引擎 engine = create_async_engine( settings.DATABASE_URL, echo=settings.DEBUG, pool_pre_ping=True ) AsyncSessionLocal = async_sessionmaker( bind=engine, class_=AsyncSession, expire_on_commit=False ) @asynccontextmanager async def get_db(): async with AsyncSessionLocal() as session: try: yield session await session.commit() except Exception: await session.rollback() raise async def create_tables(): async with engine.begin() as conn: await conn.run_sync(SQLModel.metadata.create_all) print("✅ 所有数据库表已创建完成!") async def close_db(): await engine.dispose() # backend/dependencies.py from fastapi import Depends, HTTPException from sqlalchemy import select from database import User, get_db from jwt_handler import get_current_user_id async def get_current_active_user(user_id: str = Depends(get_current_user_id)): async with get_db() as db: result = await db.execute(select(User).where(User.id == int(user_id))) user = result.scalar_one_or_none() if not user: raise HTTPException(status_code=404, detail="用户不存在") return user # backend/jwt_handler.py from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Optional import os from dotenv import load_dotenv from fastapi import Cookie, Depends, HTTPException from jose import jwt, JWTError from passlib.hash import pbkdf2_sha256 from pydantic import BaseModel from config import settings # 使用统一配置 from logger_setup import app_logger as logger # ==================== 模型定义 ==================== class TokenData(BaseModel): user_id: Optional[str] = None # ==================== 密码工具 ==================== def get_password_hash(password: str) -> str: """ 使用 PBKDF2-SHA256 对密码进行哈希。 默认 rounds=29000,安全性高,适合用户密码存储。 """ return pbkdf2_sha256.hash(password) def verify_password(plain_password: str, hashed_password: str) -> bool: """ 校验明文密码是否匹配哈希值。 Passlib 会自动识别 salt 和 rounds。 """ return pbkdf2_sha256.verify(plain_password, hashed_password) # ==================== JWT 工具函数 ==================== def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str: """ 创建 JWT 访问令牌 :param data: 要编码的数据,建议包含 {"sub": "user_id"} :param expires_delta: 可选的过期时间偏移量 :return: 编码后的 JWT 字符串 """ to_encode = data.copy() expire = datetime.now(timezone.utc) + ( expires_delta if expires_delta else timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) ) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) logger.info(f"✅ JWT 已生成,有效期至: {expire}") return encoded_jwt def decode_access_token(token: str) -> Optional[dict]: """ 【同步】解码 JWT 并返回 payload(可用于中间件、日志等非 await 上下文) :param token: JWT 字符串 :return: 解码后的 payload 或 None(无效/过期) """ try: payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) logger.debug(f"🔍 JWT 成功解码: {payload}") return payload except JWTError as e: logger.warning(f"❌ JWT 解码失败 (JWTError): {e}") return None except Exception as e: logger.error(f"❌ 意外错误解码 JWT: {e}") return None # ==================== FastAPI 依赖项 ==================== async def get_current_user_id(access_token: str = Cookie(None)) -> str: """ FastAPI 依赖:从 HttpOnly Cookie 提取用户 ID 若未登录或 token 无效,抛出 401 错误 :return: 用户 ID(字符串) """ if not access_token: logger.warning("🚫 请求缺少 access_token") raise HTTPException(status_code=401, detail="未登录") payload = decode_access_token(access_token) if not payload: logger.warning("⚠️ 无法解析 JWT payload") raise HTTPException(status_code=401, detail="凭证无效") user_id: str = payload.get("sub") if not user_id: logger.warning("⚠️ JWT 中缺少 'sub' 字段") raise HTTPException(status_code=401, detail="凭证不完整") logger.info(f"👤 当前用户已认证: user_id={user_id}") return user_id async def get_current_active_user(user_id: str = Depends(get_current_user_id)): """ 扩展依赖:根据 user_id 查询数据库中的活跃用户对象 (可在此处添加封禁检查、角色权限判断等) """ from database import get_user_by_id user = await get_user_by_id(int(user_id)) if not user: logger.warning(f"❌ 用户不存在: user_id={user_id}") raise HTTPException(status_code=404, detail="用户不存在") if user.role == "banned": raise HTTPException(status_code=403, detail="该账户已被封禁") return user # backend/logger_setup.py import logging import os from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler from pathlib import Path from config import BASE_DIR LOG_DIR = BASE_DIR.parent / "logs" LOG_DIR.mkdir(exist_ok=True) def setup_logger(): logger = logging.getLogger("chat_app") logger.setLevel(logging.INFO) # 防止重复添加 handler if logger.handlers: return logger # 格式 formatter = logging.Formatter( '%(asctime)s | %(levelname)s | %(name)s | %(funcName)s() | %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 1. 按时间切割的日志文件(每天一个) file_handler = TimedRotatingFileHandler( LOG_DIR / "app.log", when="midnight", interval=1, backupCount=7, # 保留最近7天 encoding='utf-8' ) file_handler.setFormatter(formatter) file_handler.setLevel(logging.INFO) # 2. 控制台输出 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) console_handler.setLevel(logging.INFO) # 添加到 logger logger.addHandler(file_handler) logger.addHandler(console_handler) return logger app_logger = setup_logger() # backend/main.py from fastapi import FastAPI from fastapi.staticfiles import StaticFiles from config import FRONTEND_DIR from logger_setup import app_logger as logger from routers import auth, posts, comments, departments, search, chat_rooms app = FastAPI(title="AI社交平台", version="1.0") @app.middleware("http") async def log_requests(request, call_next): logger.info(f"➡️ {request.method} {request.url.path} | IP: {request.client.host}") response = await call_next(request) logger.info(f"⬅️ Status: {response.status_code}") return response app.mount("/static", StaticFiles(directory=str(FRONTEND_DIR / "static")), name="static") app.include_router(auth.router) app.include_router(posts.router) app.include_router(comments.router) app.include_router(departments.router) app.include_router(search.router) app.include_router(chat_rooms.router) if __name__ == "__main__": import uvicorn uvicorn.run("main:app", host="127.0.0.1", port=8000, reload=True) 整理一下,把缺失的部分补全
最新发布
11-07
int format_unknown_device(const char *device, const char* path, const char *fs_type) { 991 LOGW("clean the partition %s in the rm - rf way \n", path); 992 993 static char tmp[PATH_MAX]; 994 bool DEBUG = false; 995 if (strcmp(path, "/data") == 0) { 996 char property_wipemedia[PROPERTY_VALUE_MAX+1]; 997 persist_property_get("persist.sys.wipemedia", property_wipemedia, "0"); 998 printf("In format_unknown_device funtion, persist.sys.wipemedia is %s \n", property_wipemedia); 999 1000 ensure_path_mounted(path); 1001 1002 //Yang.Li@PSW.AD.Recovery.1596362, 2018/11/26, Add for master clear in FBE 1003 /*if (encrypt_type == 1) { 1004 int pw_type = get_password_type(0); 1005 if (pw_type > 0) { 1006 bool reset_pwd_ret = false; 1007 char secret_buffer[65] = {0}; 1008 bool ret = get_secret_hex((uint8_t*)secret_buffer); 1009 secret_buffer[64] = 0; 1010 std::string secret_hex = secret_buffer; 1011 reset_pwd_ret = fscrypt_clear_user_key_auth(0, 0, "!", secret_hex); 1012 printf("fscrypt_clear_user_key_auth, reset_pwd_ret=%d \n", reset_pwd_ret); 1013 reset_pwd_ret = fscrypt_fixate_newest_user_key_auth(0); 1014 printf("fscrypt_fixate_newest_user_key_auth is %d\n", reset_pwd_ret); 1015 } 1016 }*/ 1017 1018 #ifdef OPLUS_FEATURE_RECOVERY_BOOT 1019 //Yang.Li@ANDROID.UPDATABILITY, 2016/09/18, Add for deleting other special data when wipe sdcard 1020 /*if (strcmp(property_wipemedia, "0") != 0) { 1021 //Xuefeng.Peng@PSW.AD.Recovery.1880299, 2019/03/06, Add for deleting user 999 1022 fscrypt_unlock_user_key(999, 10, "!", "!"); 1023 fscrypt_destroy_user_key(999); 1024 fscrypt_destroy_user_storage("", 999, STORAGE_FLAG_DE | STORAGE_FLAG_CE); 1025 sprintf(tmp, "rm -rf /data/misc/vold/user_keys/ce/999"); 1026 __system(tmp); 1027 sprintf(tmp, "rm -rf /data/misc/vold/user_keys/de/999"); 1028 __system(tmp); 1029 //end Xuefeng.Peng modify 1030 LOGW("persist.sys.wipemedia isn't 0, delete /data/media/999.......\n"); 1031 sprintf(tmp, "rm -rf /data/media/999/*"); 1032 __system(tmp); 1033 sprintf(tmp, "rm -rf /data/media/999/.*"); 1034 __system(tmp); 1035 1036 //delete actual data in /sdcard/Android/obb 1037 sprintf(tmp, "rm -rf /data/media/obb/*"); 1038 __system(tmp); 1039 sprintf(tmp, "rm -rf /data/media/obb/.*"); 1040 __system(tmp); 1041 }*/ 1042 #endif /* OPLUS_FEATURE_RECOVERY_BOOT */ 1043 1044 if (strcmp(property_wipemedia, "3") == 0) { 1045 LOGW("persist.sys.wipemedia is 3, only delete /data/media/0.......\n"); 1046 //sprintf(tmp, "cd /data/media/0 ; for f in $(ls -a); do rm -rf $f; done"); 1047 sprintf(tmp, "rm -rf /data/media/0/*"); 1048 __system(tmp); 1049 //#wangzequan@EXP.sysFramework.recovery, 2015/08/24, modify for bug684379:factory mode cannot remove hidden files 1050 sprintf(tmp, "rm -rf /data/media/0/.*"); 1051 __system(tmp); 1052 return 0; 1053 } 1054 1055 if (strcmp(property_wipemedia, "2") == 0) { 1056 static char property_auto_masterclear[PROPERTY_VALUE_MAX+1]; 1057 property_get("persist.sys.auto.masterclear", property_auto_masterclear, ""); 1058 printf("In format_unknown_device funtion, persist.sys.auto.masterclear is %s \n", property_auto_masterclear); 1059 1060 if (strcmp(property_auto_masterclear, "1") == 0) { 1061 printf("In format_unknown_device funtion, echo 1 > %s \n", "/data/engineermode/engineermode_masterclear_flag"); 1062 sprintf(tmp, "echo 1 > %s", "/data/engineermode/engineermode_masterclear_flag"); 1063 __system(tmp); 1064 } 1065 1066 DEBUG = true; 1067 LOGW("before Formatting /data/media/0.......\n"); 1068 //printDir("/data/media/0"); 1069 //ensure_path_mounted("/system"); 1070 format_except_builtin(); 1071 LOGW("after Formatting /data/media/0.......\n"); 1072 //printDir("/data/media/0"); 1073 1074 sprintf(tmp, "toybox find /data/media/0/* | toybox sed 's#/data/media/0/##g' | toybox sort > %s", "/data/engineermode/data_file_after_clear.txt"); 1075 __system(tmp); 1076 } 1077 1078 //ifdef OPLUS_FEATURE_RECOVERY_BOOT 1079 //Yang.Li@ANDROID.UPDATABILITY.1122242, 2018/01/25, Remove for transfer the task of deleting /data/app built-in apks to PMS 1080 /*if (access("/data/app", F_OK) != -1) { 1081 LOGW("rm /data/app exception built-in apk \n"); 1082 sprintf(tmp, "cd /data/app; ls | toybox sort > allfilelist; cat builtinlist | toybox sort > builtinlist_sort; cat builtinlist_sort >> %s; cat allfilelist >> %s; toybox diff -a builtinlist_sort allfilelist >> %s", TEMPORARY_LOG_FILE, TEMPORARY_LOG_FILE, TEMPORARY_LOG_FILE); 1083 __system(tmp); 1084 sprintf(tmp, "cd /data/app; toybox diff -a builtinlist_sort allfilelist | toybox grep ^+ | toybox sed '1d'| toybox sed 's/+//g' | toybox grep -v builtinlist_s | toybox grep -v allfilelist | toybox grep -v packages.xml | while read line; do echo \"$line\" >> %s; rm -rf \"$line\"; done" , TEMPORARY_LOG_FILE); 1085 __system(tmp); 1086 } else { 1087 LOGW("error access /data/app"); 1088 }*/ 1089 //#endif /* OPLUS_FEATURE_RECOVERY_BOOT */ 1090 #ifdef OPLUS_FEATURE_RECOVERY_BOOT 1091 //#wangzequan@EXP.sysFrameworks.recovery, 2016/03/04, modify for avoiding data mount fail, clear system files 1092 if (access("/data/media", F_OK) != -1) { 1093 //Yang.Li@PSW.AD.Recovery.1596362, 2018/12/03, Modify for master clear in FBE or FDE. 1094 if (encrypt_type == 1) { 1095 sprintf(tmp, "cd /data ; for f in $(ls -a | grep -E -v \"^(misc|media|\.layout_version|app|reserve|gr|engineermode|theme_bak|data|opponvitems|etc|format_unclear|dalvik-cache|unencrypted)$\"); do rm -rf $f; done"); 1096 __system(tmp); 1097 1098 //Delete /data/misc except /data/misc/vold/user_keys 1099 sprintf(tmp, "cd /data/misc; ls -a | grep -E -v \"^(vold|gatekeeper)$\" | xargs rm -rf; cd /data/misc/vold; ls -a | grep -v \"^user_keys$\" | xargs rm -rf;"); 1100 __system(tmp); 1101 __system("rm -rf /data/misc/vold/user_keys/test_secret"); 1102 1103 //Delete Multi-User data file 1104 sprintf(tmp, "cd /data ; for f in $(ls -a | grep -E \"^(misc_ce|system_ce|vendor_ce|user|media|misc_de|system_de|user_de|vendor_de)$\"); do cd $f; ls -a | grep -E \"^([1-9][0-9]*){1,3}$\" | xargs rm -rf; cd ../; done"); 1105 __system(tmp); 1106 //Delete /data/misc/vold/user_keys/ce and /data/misc/vold/user_keys/de except 0 1107 sprintf(tmp, "cd /data/misc/vold/user_keys/ce; ls -a | grep -v \"^0$\" | xargs rm -rf; cd /data/misc/vold/user_keys/de; ls -a | grep -v \"^0$\" | xargs rm -rf;"); 1108 __system(tmp); 1109 } else { 1110 sprintf(tmp, "cd /data ; for f in $(ls -a | grep -E -v \"^(media|\.layout_version|app|reserve|gr|engineermode|theme_bak|data|opponvitems|etc|format_unclear|dalvik-cache)$\"); do rm -rf $f; done"); 1111 __system(tmp); 1112 } 1113 1114 #ifdef OPLUS_FEATURE_RECOVERY_BOOT 1115 //#Fangfang.Hui@ANDROID.UPDATABILITY, 2017/02/13, Add for delete /data/data/ directory here, only delete com.coloros.encryption when /data/media/0 is deleted 1116 if (strcmp(property_wipemedia, "3") == 0) { 1117 __system("rm -rf /data/data/com.coloros.encryption"); 1118 } else { 1119 //WangFuJiang@ANDROID.CUSTOMIZE, 2020/05/19, reserve passwordmanager 1120 if (noWipeData()) { 1121 sprintf(tmp, "rm -rf /data/data"); 1122 } else { 1123 sprintf(tmp, "cd /data/data ; for f in $(ls -a | grep -E -v \"(mb.passwordmanager)$\"); do rm -rf $f; done"); 1124 } 1125 __system(tmp); 1126 } 1127 #endif /*OPLUS_FEATURE_RECOVERY_BOOT*/ 1128 } else { 1129 LOGW("error access /data/media"); 1130 } 1131 #endif 1132 1133 if (strcmp(property_wipemedia, "1") == 0) { 1134 LOGW("persist.sys.wipemedia is 1, delete /data/media/0 also .......\n"); 1135 sprintf(tmp, "rm -rf /data/media/0/*"); 1136 __system(tmp); 1137 //#wangzequan@EXP.sysFramework.recovery, 2015/08/24, modify for bug684379:factory mode cannot remove hidden files 1138 sprintf(tmp, "rm -rf /data/media/0/.*"); 1139 __system(tmp); 1140 } 1141 1142 // if the /data/media sdcard has already been migrated for android 4.2, 1143 // prevent the migration from happening again by writing the .layout_version 1144 struct stat st; 1145 if (0 == lstat("/data/media/0", &st)) { 1146 char* layout_version = "2"; 1147 FILE* f = fopen("/data/.layout_version", "wb"); 1148 if (NULL != f) { 1149 fwrite(layout_version, 1, 2, f); 1150 fclose(f); 1151 } else { 1152 LOGW("error opening /data/.layout_version for write.\n"); 1153 } 1154 } else { 1155 LOGW("/data/media/0 not found. migration may occur.\n"); 1156 } 1157 } else { 1158 ensure_path_mounted(path); 1159 LOGW("Formatting data.......\n"); 1160 sprintf(tmp, "rm -rf %s/*", path); 1161 __system(tmp); 1162 sprintf(tmp, "rm -rf %s/.*", path); 1163 __system(tmp); 1164 } 1165 1166 if (DEBUG) { 1167 LOGW("after Formatting data.......\n"); 1168 //printDir("/data"); 1169 char buf[20] = ""; 1170 FILE* f = fopen("/data/.layout_version", "r"); 1171 if (NULL != f) { 1172 fread(buf, 1, sizeof(buf)-1 , f); 1173 LOGW("/data/.layout_version = %s.......\n", buf); 1174 fclose(f); 1175 } 1176 } 1177 ensure_path_unmounted(path); 1178 return 0; 1179 } 1180 1181 extern int getBuilitinList(); 1182 1183 //#Fangfang.Hui@Swdp.Android.Recovery, 2016/05/24, Add for save some last_logs to memory and restore them later when wipe cache 1184 typedef struct _saved_log_file { 1185 char* name; 1186 struct stat st; 1187 unsigned char* data; 1188 struct _saved_log_file* next; 1189 } saved_log_file;
08-19
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值