AC自动机

DDPG算法实战:用Python一步步实现深度强化学习中的连续动作控制 本文详细介绍了DDPG算法在深度强化学习中的连续动作控制应用,通过Python和PyTorch实现从零构建智能体。内容涵盖环境搭建、网络架构设计、经验回放、OU噪声实现及训练流程优化,帮助开发者掌握DDPG在机械臂控制等场景的核心技术。 阅读详情

AC自动机

爆肝计划✪ ω ✪

我搞不懂AC自动机是什么?

大佬对我说:

自动机=tiri树+kmp;

我求大佬再详细点,

他说你弄懂了,还是这个式子。

w(゚Д゚)w ヾ(•ω•`)o

(蒟蒻) (大佬)

在这里先发一个大佬的连接吧。[洛谷日报第44期]强势图解AC自动机,在这里我就详细讲一下过程

  1. 应用方向:

    举一个常见的例子吧:

    就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过

  2. 当时,当提出kmp思想时,我只是单纯认为直接把kmp的模板拷过去就可以了,然而事情并没有这么简单

着重介绍的是kmp的思维,并非代码(当时我还傻乎乎的从模板里找kmp的影子?)。

  1. 那么就开始讲过程吧。

    (字丑,见谅)

    如果对这图感兴趣可以点击这里→字典树学习

那我们开始吧

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上是Fail形成和ac自动机寻找过程’

那么上这题基础模板吧

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000005

int trie[maxn][256]; //字典树
int cntword[maxn];  //记录该单词出现次数
int fail[maxn];     //失败时的回溯指针
int cnt = 0;

void insertWords(string s){
   int root = 0;
   for(int i=0;i<s.size();i++){
       int next = s[i] - 'a';
       if(!trie[root][next])
           trie[root][next] = ++cnt;
       root = trie[root][next];
   }
   cntword[root]++;      //当前节点单词数+1
}
void getFail(){
   queue <int>q;
   for(int i=0;i<26;i++){      //将第二层所有出现了的字母扔进队列
       if(trie[0][i]){
           fail[trie[0][i]] = 0;
           q.push(trie[0][i]);
       }
   }

//fail[now]    ->当前节点now的失败指针指向的地方
////tire[now][i] -> 下一个字母为i+'a'的节点的下标为tire[now][i]
   while(!q.empty()){
       int now = q.front();
       q.pop();

       for(int i=0;i<26;i++){      //查询26个字母
           if(trie[now][i]){
               //如果有这个子节点为字母i+'a',则
//让这个节点的失败指针指向(((他父亲节点)的失败指针所指向的那个节点)的下一个节点)
               //有点绕,为了方便理解特意加了括号

               fail[trie[now][i]] = trie[fail[now]][i];
               q.push(trie[now][i]);
           }
           else//否则就让当前节点的这个子节点
               //指向当前节点fail指针的这个子节点
               trie[now][i] = trie[fail[now]][i];
       }
   }
}


int query(string s){
   int now = 0,ans = 0;
   for(int i=0;i<s.size();i++){    //遍历文本串
       now = trie[now][s[i]-'a'];  //从s[i]点开始寻找
       for(int j=now;j && cntword[j]!=-1;j=fail[j]){
           //一直向下寻找,直到匹配失败(失败指针指向根或者当前节点已找过).
           ans += cntword[j];
           cntword[j] = -1;    //将遍历国后的节点标记,防止重复计算
       }
   }
   return ans;
}

int main() {
   int n;
   string s;
   cin >> n;
   for(int i=0;i<n;i++){
       cin >> s ;
       insertWords(s);
   }
   fail[0] = 0;
   getFail();
   cin >> s ;
   cout << query(s) << endl;
   return 0;
}

不多说,来个病毒二连击( ̄y▽, ̄)╭

病毒侵袭 -HDU2896

Problem Description

当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~
但网路上总有那么些网站,开始借着民众的好奇心,打着介绍日食的旗号,大肆传播病毒。小t不幸成为受害者之一。小t如此生气,他决定要把世界上所有带病毒的网站都找出来。当然,谁都知道这是不可能的。小t却执意要完成这不能的任务,他说:“子子孙孙无穷匮也!”(愚公后继有人了)。
万事开头难,小t收集了好多病毒的特征码,又收集了一批诡异网站的源码,他想知道这些网站中哪些是有病毒的,又是带了怎样的病毒呢?顺便还想知道他到底收集了多少带病毒的网站。这时候他却不知道何从下手了。所以想请大家帮帮忙。小t又是个急性子哦,所以解决问题越快越好哦~~

Input

第一行,一个整数N(1<=N<=500),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在20—200之间。
每个病毒都有一个编号,依此为1—N。
不同编号的病毒特征码不会相同。
在这之后一行,有一个整数M(1<=M<=1000),表示网站数。
接下来M行,每行表示一个网站源码,源码字符串长度在7000—10000之间。
每个网站都有一个编号,依此为1—M。
以上字符串中字符都是ASCII码可见字符(不包括回车)。

Output

依次按如下格式输出按网站编号从小到大输出,带病毒的网站编号和包含病毒编号,每行一个含毒网站信息。
web 网站编号: 病毒编号 病毒编号 …
冒号后有一个空格,病毒编号按从小到大排列,两个病毒编号之间用一个空格隔开,如果一个网站包含病毒,病毒数不会超过3个。
最后一行输出统计信息,如下格式
total: 带病毒网站数
冒号后有一个空格。

Sample Input

3
aaa
bbb
ccc
2
aaabbbccc
bbaacc

Sample Output

web 1: 1 2 3
total: 1

这是一道ac自动机基础题,仔细一读肯定会发现并没有太多改动的地方,我们要做的是给依次标记,输出即可。

#include <cstdio>
#include <iostream>
#include <string.h>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
const int maxk=128,maxn=10005;
char s[maxn],a[maxk*2];
struct node {
	struct node *fail;
	struct node *nxt[maxk];
	int cnt,id;
	
	void init() {
		for (int i=0;i<maxk;i++) nxt[i]=NULL;
		fail=NULL;
		cnt=id=0;
	}
};
 
void insert(string s,node *root,int len,int id) {
	node *p=root;
	int i;
	for (i=0;i<len;i++) {
		int pos=s[i];
		if (p->nxt[pos]==NULL) {
			p->nxt[pos]=new node;
			p->nxt[pos]->init();
		}
		p=p->nxt[pos];
	}
	p->cnt++;
	p->id=id;
}
 
void buildfail(node *root) {
	node *p=root;
	node *now;
	int front=0,tail=0,i;
	queue<node *> q;
	for (i=0;i<maxk;i++) {
		if (p->nxt[i]!=NULL) {
			p->nxt[i]->fail=root;
			q.push(p->nxt[i]);
		} else p->nxt[i]=root;
	}
	while (!q.empty()) {
		now=q.front();
		q.pop();
		for (i=0;i<maxk;i++) {
	    	if (now->nxt[i]!=NULL) {
		    	now->nxt[i]->fail=now->fail->nxt[i];
		    	q.push(now->nxt[i]);
	    	} else now->nxt[i]=now->fail->nxt[i];
    	}
	}
}
 
bool search(string s,node *root,int len,int cas) {
	int k=0,i;
	node *q[3];
	node *p=root,*now;
	for (i=0;i<len;i++) {
		p=p->nxt[s[i]];
		now=p;
		while (now!=root&&now->cnt!=-1) {
			if (now->cnt) {
				q[k++]=now;
				now->cnt=-1;
			}
			now=now->fail;
		}
 	}
 	if (k) {
 		printf("web %d:",cas);
 		int id[3];
 		for (i=0;i<k;i++) id[i]=q[i]->id;
 		sort(id,id+k);
 		for (i=0;i<k;i++) {
 			printf(" %d",id[i]);
 			q[i]->cnt=1;
 		}
 		printf("\n");
 		return true;
 	}
	return false;
}
 
int main() {
	int n,len,i,j,tot=0;
	node *root=new node;
	root->init();
	scanf("%d",&n);
	for (i=1;i<=n;i++) {
		scanf("%s",a);
		insert(a,root,strlen(a),i);
	}
	buildfail(root);
	scanf("%d",&n);
	for (i=1;i<=n;i++) {
		scanf("%s",s);
		tot+=search(s,root,strlen(s),i);
	}
	printf("total: %d\n",tot);
	return 0;
}

第二道

病毒侵袭持续中 HDU3065

Problem Description

小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?

Input

第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

Output

按以下格式每行一个,输出每个病毒出现次数。未出现的病毒不需要输出。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。

Sample Input

3
AA
BB
CC
ooxxCC%dAAAoen....END

Sample Output

AA: 2
CC: 1

在这里,我们要建一个结构体,里面存储该病毒的次序,特征,次数,然后在查询中记录次数,最后依次把不为0的数挑出来输出即可。同时注意题中说明是大写字母,那么可以将不是大写字母的字符去掉,在进行查找。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define son_num 26
#define maxn 2000005
struct nodev //创建病毒结构体
{
    char name[55]; //病毒名字
    int num; //病毒出现的次数
}virus[1010];
char web[maxn];
struct node
{
    int code;
    int terminal;
    node *fail;
    node *next[son_num];
    node()
    {
        fail=NULL;
        code=0;
        terminal=0;
        memset(next,NULL,sizeof(next));
    }
};
node *que[maxn];
//构建Tire树
void insert(node *root,char *str,int x) //x为该病毒的编号
{
    node *p=root;
    int i=0,index;
    while(str[i])
    {
        index=str[i]-'A';
        if(p->next[index]==NULL)
          p->next[index]=new node();
        p=p->next[index];
        i++;
    }
    p->code=x;
    p->terminal=1;
}
//寻找失败指针
void build_fail(node *root)
{
    int head=0,tail=0;
    root->fail=NULL;
    que[head++]=root;
    while(head!=tail)
    {
        node *temp=que[tail++];
        node *p=NULL;
        for(int i=0;i<son_num;i++)
        {
            if(temp->next[i]!=NULL)
            {
                if(temp==root) temp->next[i]->fail=root;
                else{
                p=temp->fail;
                while(p!=NULL)
                {
                    if(p->next[i]!=NULL)
                    {
                        temp->next[i]->fail=p->next[i];
                        break;
                    }
                    p=p->fail;
                }
                if(p==NULL)
                  temp->next[i]->fail=root;}
                que[head++]=temp->next[i];
            }
        }
    }
}
//询问主串中含有多少个关键字
void query(node *root,char *str)
{
    int i=0,cnt=0,index,len;
    len=strlen(str);
    node *p=root;
    while(str[i])
    {
        if(isupper(str[i])) //判断当前字符是否为大写字母
        {
            index=str[i]-'A';
            while(p->next[index]==NULL&&p!=root)
              p=p->fail;
            p=p->next[index];
            if(p==NULL) p=root;
            node *temp=p;
            while(temp!=root&&temp->code)
            {
                virus[temp->code].num+=temp->terminal;
                temp=temp->fail;
            }
        }
        else p=root; //如果不是大写字母,则指向树根
        i++;
    }
}
int main()
{
    int n;
    while(scanf("%d",&n)!=-1)
    {
        node *root=new node();
        for(int i=1;i<=n;i++)
        {
            scanf("%s",virus[i].name);
            virus[i].num=0;
            insert(root,virus[i].name,i);
        }
        build_fail(root);
        scanf("%s",web);
        query(root,web);
        for(int i=1;i<=n;i++)
          if(virus[i].num)  //输出出现过的病毒特征码
            printf("%s: %d\n",virus[i].name,virus[i].num);
    }
    return 0;
}

AC自动机真有意思≡(▔﹏▔)≡

令人头大。。。

有不准确的留言呦(* ̄3 ̄)╭

相场断裂模型中的各向异性机制:从裂纹密度到驱动力的数值实现 断裂力学是研究材料在载荷作用下裂纹萌生与扩展规律的基础学科,其核心在于理解材料失效的能量准则与路径选择。传统方法通常预设裂纹路径,而相场断裂模型通过引入连续的相场变量,将裂纹模拟转化为一个能量最小化问题,能够自发预测裂纹的萌生、扩展与分叉,在工程失效分析中具有重要价值。当材料具有显著的方向依赖性时,如单晶、复合材料或轧制金属板,各向同性假设会失效,此时需引入各向异性机制。该机制的核心在于改造两个关键部分:一是裂纹密度函数,通过引入各向异性张量来定义不同方向上形成裂纹微结构的能量成本;二是临界能量释放率(断裂 阅读详情

相关推荐

abaqus 6.13安装(ubuntu 16.04LTS)

1。从iso将文件拷贝出来 2。chmod 777 -R ./* 给文件权限 3。sudo /home/xx/A/setup 4。安装licenseserver 5。拷贝lic,log文件 6。打开license sudo ./lmgrd -c path 7. 27011@xx or 27011@localhost ...

a1099313374的博客 1950

【洛谷】P3808 【模板】AC 自动机(简单版)

https://www.luogu.com.cn/problem/P3808题目背景: 这是一道简单的AC自动机模板题,用于检测正确性以及算法常数。题目描述: 给定nnn个模式串sis_isi​和一个文本串ttt,求有多少个不同的模式串在文本串里出现过。两个模式串不同当且仅当他们编号不同。输入格式: 第一行是一个整数,表示模式串的个数 nnn。 第 222 到第 (n+1)(n + 1)(n+1) 行,每行一个字符串,第 (i+1)(i + 1)(i+1) 行的字符串表示编号为 iii 的模式串 sis_i

数学、算法爱好者的博客 622

Hadoop生态系统-新手快速入门(含HDFS、HBase系统架构)

Hadoop简介 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。 Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量...

Hadoop环境搭建教程 472

洛谷日报索引

2022 年洛谷日报索引 2月 #383 [159号程序员] CSP初赛知识点梳理 https://www.luogu.com.cn/blog/334586/csp-pre-knowledge #382 [xtx1092515503] 群论学习笔记 https://www.luogu.com.cn/blog/Troverld/qun-lun-xue-xi-bi-ji #381 [Alpha1022] 浅谈集合幂级数 https://www.luogu.com.cn/blog/your-alpha1022/q

王俊吉的博客 12万+

从DWS到设备树:MTK平台LK阶段GPIO初始化的隐秘路径与调试实战

本文深入探讨了MTK平台LK阶段GPIO初始化的完整流程,揭示了从DWS配置到设备树生成的隐秘转换路径。通过分析MT6768等平台的启动框架,提供了针对preloader到LK阶段GPIO初始化异常的实战调试方法与最佳实践,帮助开发者有效解决硬件与软件配置不匹配的常见问题。

h9j8k7l6m5n的博客 1003

win x64下安装oracle 12c出现[INS-30131]报错的解决方案

问题:  win x64下安装oracle 12c出现[INS-30131]报错的解决方案 安装oracle11g碰到“无法访问临时位置”的问题,详细信息如下: INS-30131] 执行安装程序验证所需的初始设置失败。 原因 - 无法访问临时位置。   操作 - 请确保当前用户具有访问临时位置所需的权限。   附加信息:  - 所有节点上的框架设置检查都失败  

一条道走到黑的GISer 1347

AC自动机-详解AC自动机以及模板

AC自动机-详解AC自动机以及模板AC自动机算法简介AC自动机算法大致流程AC自动机详细图解AC自动机模板题与模板题目内容代码详解完整代码 AC自动机算法简介 首先简要介绍一下AC自动机,英文名:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模板匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。 要搞懂AC自动机,先要有字典树Trie和KMP模式匹配算法的基础知识。其中,KMP是用于一对一的字符串匹

qq_43381135的博客 6857

分位数映射数据后处理-Quantile Mapping后处理 (R语言)

统计后处理器基本上是统计模型,将观察到的关注变量与从气象或水文模型的直接模型输出(DMO)导出的适当预测变量相关联。统计后处理的重要性早已在气象预报中得到认可。早期的工作包括完善的预测(perfect prognosis),模型输出统计(MOS)和模拟方法(analog method)等模型。 近年来,已经提出了许多其他后处理方法,包括秩直方图校准(rank histogram calibrati...

水滴石穿,绳锯木断 1万+

AC自动机(详解)

需要提前了解的知识:KMP, 字典树 例题:传送门 AC自动机是KMP和字典树的结合体, 如果说KMP用于单模式匹配,那么AC自动机是用于多模式匹配的。 举个例子,KMP适用于在一篇文章中找一句话, AC自动机适合在一篇文章中寻找多句话(并不是简单的多用几次KMP)。 KMP算法构建了一个查询表(nex数组), 我们可以按照相同的思路构建nex表,在ac自动机中成为失配数组。 算法思路: 先将所有的模式串建立字典树, 建立nex数组,然后就开始匹配。 ...

三季人的博客 1万+

手把手教你用STM32驱动SPL06-001气压传感器(附完整代码与避坑指南)

本文详细介绍了如何使用STM32驱动SPL06-001气压传感器,包括硬件连接、寄存器配置、驱动层实现和数据补偿算法。通过完整的代码示例和避坑指南,帮助开发者快速掌握SPL06传感器的应用技巧,提升嵌入式系统开发效率。

weixin_42552315的博客 294

渲染TA实战:冰面效果制作分享

这里画一张图:我们可以看到,如果深度图的范围没有进过缩放,那就是0-1,但是归一化的-viewDir的向量长度为1,如果-viewDir不和表面垂直(这是绝大多数的情况),那么viewDir.z的分量就是一个不定值,我们不好确定需要走多少步,viewDir才能和底面相交。然后我们需要冰面的Alpha图:因为冰是透明物体,所以相对于Albedo,我们更需要的是一张冰面裂纹的蒙版图,这张图需要记录冰面的裂纹走向和深浅、冰封的气泡、以及因为压力或气体等原因产生的类似雾的效果。

qq_41166022的博客 1027

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解

代码改变世界 3589

UE5音效系统全解析:从Sound Cue到MetaSounds的实战指南

在游戏开发中,音频系统是构建沉浸式体验的关键技术之一。其核心原理在于通过数字信号处理(DSP)和空间音频渲染,模拟真实世界的听觉感知。传统音频管线通常基于静态资源播放与混合,而现代引擎则引入了程序化音频生成与动态调制技术,这极大地提升了音频的互动性与表现力,使其能够实时响应游戏状态变化。这一技术革新对于开发开放世界、VR及3A级游戏尤为重要,它能实现风吹草动皆有不同声响、音效随环境动态变化的细腻效果。本文聚焦虚幻引擎5(UE5)的音效系统,深入剖析其新旧两套核心架构:稳定高效的Sound Cue、Sound

weixin_31179927的博客 332

AC自动机详细讲解

AC自动机详细讲解

温姑娘的博客 2699

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AC自动机算法

AC自动机简介:  首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie和KMP模式匹配算法的基础知识。KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。

飘过的小牛 9万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AC自动机总结

如果你还不知道KMP是什么,或者不知道Trie是什么,先点下面的链接,学好这两样再来看这篇文章。 KMP入门教程传送门。 Trie入门教程传送门。 好,那么我来讲讲AC自动机吧。 以洛谷P3808模板题为例, 如果我们有n个模式串,和一个文本串,我们需要统计有多少个模式串在文本串中出现了,怎么办? 显然,如果我们直接枚举每个模式串,然后将其与文本串进行匹配,判断是否匹配成功,那么效率就

Holylight_Knight 1641

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

AC自动机步骤详解

AC自动机 算法意义: 求多个字符串是否在主串中出现过。可依据情况分别求出出现次数,出现位置等。 学习基础: 要搞懂AC自动机,先得有模式树(字典树)Trie和KMP模式匹配算法的基础知识。 AC自动机的构造: 1.构造一棵Trie,作为AC自动机的搜索数据结构。 2.构造fail指针,使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。如同 KMP算法一样, AC自

问鼎63的博客 2511

AC 自动机

AC 自动机 引入 AC 自动机是一种用于解决多模式串以及一主串匹配的字符串算法。 问题通常是给出若干个模式串 S 以及主串 T,询问若干个模式串分别在主串中的某些信息。 AC 自动机构建在 Trie 的结构基础上,结合了 KMP 算法的失配指针思想。 在进行多模式串匹配前,只有两个步骤需要去实现: 将所有模式串扔进一棵 Trie 树中。 对于 Trie 上的所有节点构建失配指针。 AC 自动机的时间复杂度约为 O(n+m)O(n+m)O(n+m)。 算法思想 AC 自动机其实就是在 Trie

orz 1823
上一篇: Hash 算法(A - Crazy Search)
下一篇: 我回来填坑了(01字典树)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值