本来想写树状数组的 好像mymymy申对这棵树有点迷茫 不过他不回我 那就接着来AVC自动机吧
UPD:20200517UPD:20200517UPD:20200517期中考试考完了 确实考完了…这辈子没拿过这种名次我真的是吐了
UPD:20200531UPD:20200531UPD:20200531先放这 题后更 坚决不能拖到下个月再发布…

第一次看到ACACAC自动机好像是刚学的那会儿 我一看 诶这好啊 自动就能ACACAC哈哈哈 (不过洛谷上好像真有自动ACACAC机?
后来才知道ACACAC是Aho−CorasickAho-CorasickAho−Corasick 俩人名(话说为什么算法名字都是好几个人名?科♂学♂家?

简介

与KMPKMPKMP算法类似,ACACAC自动机也是用来处理字符串匹配的问题。KMPKMPKMP算法是用来处理单模式串的问题,即问:模式串TTT是否是主串SSS的子串?而ACACAC自动机是著名的多模匹配算法,用来处理多模式串的问题,例如:给出nnn个单词TiT_iTi​,再给出一段包含mmm个字符的文章SSS,问有多少个单词在文章里出现。

主要步骤

1.1.1.将所有的模式串构建成一颗TrieTrieTrie树
2.2.2.对TrieTrieTrie上所有的节点构造前缀指针
3.3.3.利用前缀指针对主串进行匹配
所以ACACAC自动机是建立在KMPKMPKMP算法和TrieTrieTrie树的基础上的 如果不会怎么办?↓
一本通提高篇 KMPKMPKMP算法
一本通提高篇 TrieTrieTrie字典树

算法流程

我觉得书上的和网上一些博客里写的不是很清楚 我通过一个初学者的视角来讲ACACAC自动机这个算法
大家都说ACACAC自动机=KMP+Trie=KMP+Trie=KMP+Trie ,那么我们一起回顾一下这两个算法

KMPKMPKMP

KMPKMPKMP算法可以在线性时间内判断AAA是否是BBB的子串以及AAA在BBB中出现的位置
KMPKMPKMP中最巧妙的nextnextnext数组:next[i]next[i]next[i]表示AAA中以iii位置为结尾的子串与AAA的前缀能够匹配的最长长度

TrieTrieTrie

TrieTrieTrie树上根节点到每个节点的路径都代表一个前缀,用树来存储大量字符串信息

那么问题来了 如果有大量的字符串需要匹配 你会选择KMP+KMP+KMP+暴力,还是选择暴力+Trie+Trie+Trie呢
当然是KMP+TrieKMP+Trie\,\,KMP+Trie哈哈
所谓ACACAC自动机,就是把KMPKMPKMP放到TrieTrieTrie上跑,KMPKMPKMP中nextnextnext数组特别重要,ACACAC自动机也有一个同等地位的failfailfail指针,和nextnextnext数组一样 都是后缀匹配前缀的最大长度 只不过failfailfail是在树上搞

定义fail[i]fail[i]fail[i]是与以iii节点为结尾的串的后缀有最大公共长度的前缀的结尾编号,如果找不到failfailfail就指向根节点
也就是说,如果一个点iii的failfailfail指针指向jjj,那么根到jjj的字符串是根到iii的字符串的一个后缀

拿图说话 当四个模式串分别是ABCD,ABD,BCD,CDABCD,ABD,BCD,CDABCD,ABD,BCD,CD TrieTrieTrie树上failfailfail的指向就是这样的

如果我们匹配到ABCDABCDABCD的DDD失配,那么我们就跳到BCDBCDBCD的DDD,看看这个DDD下面有没有能配上的,如果还是不行 就跳到CDCDCD上的DDD看看这个DDD行不行,后面也没有DDD了 所以只能回到根节点。

那么如何求出failfailfail数组呢 因为有树 所以我们想到了搜索,这里用BFSBFSBFS来解决。为什么呢?
首先我们要确定:一个节点failfailfail的指向一定是比这个点深度还小的节点。所以我们在处理当前节点iii的failfailfail数组时应该已经处理好这个节点他爹fa[i]fa[i]fa[i]的failfailfail 这样一层一层的求显然要用BFSBFSBFS。
那么我们用BFSBFSBFS实现的原理是什么呢?
注意到如果点iii的父亲fif_ifi​的failfailfail指向的是failfifail_{f_i}failfi​​,那么如果failfifail_{f_i}failfi​​有和iii值相同的儿子jjj,那么faili=jfail_i=jfaili​=j。
这里比较难理解 细品品就能品出内味

代码实现

那…上代码?(有点小紧张 我也是第一次打ACACAC自动机

建树
ACACAC自动机建树跟TrieTrieTrie其实是一样的 不过有一个要注意的就是000号节点要留着当根 所以建树要从111号节点开始

求failfailfail
用上面说到的BFSBFSBFS
有亿点注意事项:
1.1.1.刚开始我们不需要把所有的第一层failfailfail指向根,我们可以利用一个虚拟的000号点,让000的所有儿子都指向根,然后让根的failfailfail指向000就可以了。
2.2.2.遍历到uuu时,如果节点uuu儿子中没有iii时,我们要让a[u].son[i]=a[fau].son[i]a[u].son[i]=a[fa_u].son[i]a[u].son[i]=a[fau​].son[i](老套娃了…
虽然这不符合TrieTrieTrie树的构造,但这是个很有用的优化时间的办法。 假设我们匹配时匹配到了一个字符,不巧的是这个节点没有这个字符的儿子,那么我们只能回溯到前面第一个满足存在字符iii是他儿子的节点 这样就大大地浪费了时间 。所以我们在预处理时直接给他赋值为faufa_ufau​的儿子iii。faufa_ufau​的深度小于uuu,由于BFSBFSBFS的缘故faufa_ufau​一定有儿子iii,这样就确保了匹配时每一步都是通过failfailfail值转移的情况.
3.3.3.无论faufa_ufau​有没有和iii相同的儿子jjj,我们都可以放心地让faili=jfail_i=jfaili​=j,还是因为BFSBFSBFS的缘故,failjfail_jfailj​一定是有值的。

查询
前面优化已经做得很到位了 查询反而是最简单的一步
每个题的查询都大同小异 按照题的要求正常求就行
比如问你有多少个模式串在文本串里出现过(就是下面的模板题
那就不能算重 可以把每个已经加上的做个已经过的标记

先练练模板题

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

题面

#include<bits/stdc++.h>
using namespace std;
#define N int(1e6+100)
#define reg register
inline void read(int &x){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}x=s*w;
}
struct trie{int son[26],fail,end;
}a[N];
int n,cnt=1;
char s[N];
inline void insert(){int p=1,l=strlen(s);for(reg int i=0;i<l;i++){if(!a[p].son[s[i]-'a'])a[p].son[s[i]-'a']=++cnt;p=a[p].son[s[i]-'a'];}a[p].end++;
}
queue<int> q;
void getFail(){for(reg int i=0;i<26;i++)a[0].son[i]=1;q.push(1);a[1].fail=0;while(!q.empty()){int u=q.front();q.pop();for(reg int i=0;i<26;i++){int vv=a[u].son[i],fa=a[u].fail;if(!vv){a[u].son[i]=a[fa].son[i];continue;}a[vv].fail=a[fa].son[i];q.push(vv);}}
}
inline int query(){int p=1,ans=0,l=strlen(s);for(reg int i=0;i<l;i++){int vv=s[i]-'a',now=a[p].son[vv];while(now>1&&a[now].end!=-1){ans+=a[now].end,a[now].end=-1;now=a[now].fail;}p=a[p].son[vv];}return ans;
}
int main(){read(n);for(reg int i=1;i<=n;i++){scanf("%s",s);insert();}getFail();scanf("%s",s);printf("%d\n",query());
}

【模板】AC自动机(加强版)

题面
Solution:Solution:Solution:说是加强 其实就是换个问法
这题问出现次数 那么我们就在TrieTrieTrie里在每个字符串结尾标记字符串编号,在询问时把这个字符串的数量+1+1+1就好了
这题我MLEMLEMLE调了十分钟 以为是数据出大了 调小了还RERERE 后来才想起来memsetmemsetmemset也能导致MLEMLEMLE…所以不能都暴力memsetmemsetmemset,就把用过的清零就行了
代码↓:

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N 1000001
struct trie{int son[26],fail,end;void clear(){memset(son,0,sizeof(son));fail=end=0;}
}a[N];
int n,ans,cnt,vis[N];
char s[151][N],t[N];
inline void insert(char* s, int id){int p=1,l=strlen(s);for(reg int i=0;i<l;i++){if(!a[p].son[s[i]-'a'])a[p].son[s[i]-'a']=++cnt;p=a[p].son[s[i]-'a'];}a[p].end=id;
}
inline void getFail(){queue<int> q;for(reg int i=0;i<26;i++)a[0].son[i]=1;q.push(1);a[1].fail=0;while(!q.empty()){int u=q.front(),fa=a[u].fail;q.pop();for(reg int i=0;i<26;i++){int vv=a[u].son[i];if(!vv){a[u].son[i]=a[fa].son[i];continue;}a[vv].fail=a[fa].son[i];q.push(vv);}}
}
inline void query(char *s){int p=1,l=strlen(s);for(reg int i=0;i<l;i++){int vv=s[i]-'a',now=a[p].son[vv];while(now>1){if(a[now].end)vis[a[now].end]++;now=a[now].fail;}p=a[p].son[vv];}
}
int main(){while(scanf("%d",&n)){if(!n)break;for(reg int i=0;i<=cnt;i++)a[i].clear();memset(vis,0,sizeof(vis));cnt=1,ans=0;for(reg int i=1;i<=n;i++){scanf("%s",s[i]);insert(s[i],i);}scanf("%s",t);getFail();query(t);for(reg int i=1;i<=n;i++)ans=vis[i]>ans?vis[i]:ans;printf("%d\n",ans);for(reg int i=1;i<=n;i++)if(vis[i]==ans)puts(s[i]);}
}

好了 那么我们开始刷一本通题吧

Keywords Search

英语菜鸡表示网站里的题面是英文的看不懂
题目描述
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc.
Wiskey also wants to bring this feature to his image retrieval system.
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match.
输入
First line will contain one integer means how many cases will follow by.
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000)
Each keyword will only contains characters ‘a’-‘z’, and the length will be not longer than 50.
The last line is the description, and the length will be not longer than 1000000.
输出
Print how many keywords are contained in the description.
样例输入
【样例 111】
1
5
she
he
say
shr
her
yasherhs
样例输出
【样例 111】
3
提示
Solution:Solution:Solution:简述题意:给定nnn个长度不超过505050的由小写英文字母组成的单词,以及一篇长为mmm的文章,问有多少个单词在文章中出现了,多组数据。
又是裸题哈哈 别忘了每个节点可能有多个单词结尾就行
连刷三道模板题真爽
上代码

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N 1000
#define M 1000001
struct trie{int son[26],fail,end;void clear(){memset(son,0,sizeof(son));fail=end=0;}
}a[N];
int n,T,cnt;
char s[N],t[M];
inline void insert(char* s, int id){int p=1,l=strlen(s);for(reg int i=0;i<l;i++){if(!a[p].son[s[i]-'a'])a[p].son[s[i]-'a']=++cnt;p=a[p].son[s[i]-'a'];}a[p].end++;
}
inline void getFail(){queue<int> q;for(reg int i=0;i<26;i++)a[0].son[i]=1;q.push(1);a[1].fail=0;while(!q.empty()){int u=q.front(),fa=a[u].fail;q.pop();for(reg int i=0;i<26;i++){int vv=a[u].son[i];if(!vv){a[u].son[i]=a[fa].son[i];continue;}a[vv].fail=a[fa].son[i];q.push(vv);}}
}
inline int query(char *s){int p=1,ans=0,l=strlen(s);for(reg int i=0;i<l;i++){int vv=s[i]-'a',now=a[p].son[vv];while(now>1){if(a[now].end>0)ans+=a[now].end,a[now].end=-1;now=a[now].fail;}p=a[p].son[vv];}return ans;
}
int main(){scanf("%d",&T);while(T--){scanf("%d",&n);for(reg int i=0;i<=cnt;i++)a[i].clear();cnt=1;for(reg int i=1;i<=n;i++){scanf("%s",s);insert(s,i);}scanf("%s",t);getFail();printf("%d\n",query(t));}
}

玄武密码

题面
这个题洛谷上标签是后缀自动机??紫题?。。。 我笑了
Solution:Solution:Solution:把所有走过的点都加上标记,然后每个字符串都查询最末尾有标记的编号就是答案
上代码↓

#include<bits/stdc++.h>
using namespace std;
#define N int(1e7+100)
#define M int(1e5+100)
#define reg register
inline int modify(char chr){if(chr=='E')return 0;if(chr=='S')return 1;if(chr=='W')return 2;if(chr=='N')return 3;
}
struct node{int son[4],fail;
}a[M*100];
int n,m,cnt=1;
char str[N],s[M][101];
bool ck[N];
inline void insert(int id){int p=1,l=strlen(s[id]);for(reg int i=0;i<l;i++){int chr=modify(s[id][i]);if(!a[p].son[chr])a[p].son[chr]=++cnt;p=a[p].son[chr];}
}
void getFail(){queue<int> q;for(reg int i=0;i<4;i++)a[0].son[i]=1;a[1].fail=0;q.push(1);while(!q.empty()){int u=q.front();q.pop();for(reg int i=0;i<4;i++){int vv=a[u].son[i],fa=a[u].fail;if(!vv){a[u].son[i]=a[fa].son[i];continue;}a[vv].fail=a[fa].son[i];q.push(vv);}}
}
void mark(){int p=1,now=0;for(reg int i=0;i<n;i++){int chr=modify(str[i]),now=a[p].son[chr];while(now>1&&!ck[now])ck[now]=1,now=a[now].fail;p=a[p].son[chr];}
}
inline int solve(int id){int l=strlen(s[id]),p=1,ans=0;for(reg int i=0;i<l;i++){int chr=modify(s[id][i]);p=a[p].son[chr];if(ck[p])ans=i+1;}return ans;
}
int main(){scanf("%d%d",&n,&m);scanf("%s",str);for(reg int i=1;i<=m;i++){scanf("%s",s[i]);insert(i);}getFail();mark();for(reg int i=1;i<=m;i++){printf("%d\n",solve(i));}
}

Censoring

题面
Solution:ACSolution:ACSolution:AC自动机+++栈
这个题KMPKMPKMP里也有一个弱化版 具体看这里:一本通提高篇KMPKMPKMP 用到的是KMP+KMP+KMP+栈
两个题思想都是一样的,每次记下当前匹配的位置,当一个单词被删除的时候,返回到单词首字母前面的位置,按上次的位置接着匹配就可以了
没什么难的 上代码就行

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N int(1e5+100)
struct node{int son[26],fail,len;
}a[N];
int n,cnt,top,ans[N],pos[N];
char s[N],str[N];
inline void insert(){int p=0,l=strlen(s);for(reg int i=0;i<l;i++){if(!a[p].son[s[i]-'a'])a[p].son[s[i]-'a']=++cnt;p=a[p].son[s[i]-'a'];}a[p].len=l;
}
void getFail(){queue<int> q;for(reg int i=0;i<26;i++)if(a[0].son[i]){q.push(a[0].son[i]);a[a[0].son[i]].fail=0;}while(!q.empty()){int u=q.front(),fa=a[u].fail;q.pop();for(reg int i=0;i<26;i++){int vv=a[u].son[i];if(vv){a[vv].fail=a[fa].son[i];q.push(vv);}else a[u].son[i]=a[fa].son[i];}}
}
int main(){scanf("%s%d",str,&n);for(reg int i=1;i<=n;i++){scanf("%s",s);insert();}getFail();int l=strlen(str),p=0;for(reg int i=0;i<l;i++){pos[i]=p=a[p].son[str[i]-'a'],ans[++top]=i;if(a[p].len){top-=a[p].len;p=pos[ans[top]];}}for(reg int i=1;i<=top;i++)putchar(str[ans[i]]);puts("");
}

我说这题忘了getfailgetfailgetfail调了十多分钟你们信么

单词

题面
Solution:Solution:Solution:这道题有两种做法
首先最容易想到的是把所有串弄成一个大长串 然后套ACACAC自动机,但是会TLETLETLE 所以要用到拓扑排序优化的ACACAC自动机 显然我不会
于是我想到了第二种方法,考虑failfailfail树的性质
对于模式串sis_isi​,如果某一个串的前缀中有sis_isi​,那么这个串在failfailfail树里一定经过sis_isi​的结尾点。如果一个串的中间或后缀中有这个sis_isi​,那么这个串的failfailfail值对应的串一定过sis_isi​。
所以ansi=sumfaili+sumians_i=sum_{fail_i}+sum_iansi​=sumfaili​​+sumi​
要用到逆bfsbfsbfs序,那就手写队列
上代码:

#include<bits/stdc++.h>
using namespace std;
#define N int(1e6+100)
#define reg register
struct trie{int son[26],fail;
}a[N];
int n,cnt,ans[N],num[N],q[N];
char s[N];
inline void insert(int id){int l=strlen(s),p=0;for(reg int i=0;i<l;i++){if(!a[p].son[s[i]-'a'])a[p].son[s[i]-'a']=++cnt;p=a[p].son[s[i]-'a'],ans[p]++;}num[id]=p;
}
void getFail(){int head=0,tail=0;for(reg int i=0;i<26;i++)if(a[0].son[i])q[++tail]=a[0].son[i];while(head<tail){int u=q[++head],v,fa=a[u].fail;for(int i=0;i<26;i++){v=a[u].son[i];if(v){q[++tail]=v;a[v].fail=a[fa].son[i];}else a[u].son[i]=a[fa].son[i];}}
}
int main(){scanf("%d",&n);for(reg int i=1;i<=n;i++){scanf("%s",s);insert(i);}getFail();for(reg int i=cnt;i;i--)ans[a[q[i]].fail]+=ans[q[i]];for(reg int i=1;i<=n;i++)printf("%d\n",ans[num[i]]);
}

最短母串

题面
状压dpdpdp 爬 这章写完先写动归吧 把dpdpdp好好补补 毕竟啥都得用dpdpdp

病毒

题面
Solution:Solution:Solution:这题要用到判环 想看跟判环有关的题可以来这篇鸭SPFASPFASPFA判负环
要有无限长的可行串,我们可以将结点连接到儿子当作一条单向边,同时失配指针也当作一条单向边,如果存在一个环,且环上没有任何危险标记,那么ACACAC自动机就能一直在环上匹配,并且永远也不会得到为模式串的一个子串,就像程序中的死循环一样。
求环当然还是dfsdfsdfs简单 有环yesyesyes没环nonono就行 (((我把NIENIENIE看成NTENTENTE看半天才改过来
上代码

#include<bits/stdc++.h>
using namespace std;
#define reg register
#define N int(3e4+100)
struct node{int son[2],fail;bool safe;
}a[N];
int n,cnt,vis[N];
char s[N];
inline void insert(){int p=0,l=strlen(s);for(reg int i=0;i<l;i++){if(!a[p].son[s[i]&15])a[p].son[s[i]&15]=++cnt;p=a[p].son[s[i]&15];}a[p].safe=true;
}
void getFail(){queue<int> q;for(reg int i=0;i<2;i++)if(a[0].son[i]){q.push(a[0].son[i]);}while(!q.empty()){int u=q.front(),fa=a[u].fail;q.pop();for(reg int i=0;i<2;i++){int vv=a[u].son[i];if(vv){a[vv].fail=a[fa].son[i];if(a[a[fa].son[i]].safe)a[vv].safe=true;q.push(vv);}else a[u].son[i]=a[fa].son[i];}}
}
inline bool dfs(int x){if(vis[x]==1)return true;if(vis[x]==-1)return false;vis[x]=1;for(reg int i=0;i<2;i++){int now=a[x].son[i];if(!a[now].safe){if(dfs(now))return true;}}vis[x]=-1;return false;
}
int main(){scanf("%d",&n);for(reg int i=1;i<=n;i++){scanf("%s",s);insert();}getFail();if(dfs(0))puts("TAK");else puts("NIE");
}

文本生成器

题面
AC+dpAC+dpAC+dp写完dpdpdp回来补(不是我没时间写了

一本通提高篇 AC自动机相关推荐

  1. 《信息学奥赛一本通 提高篇》

    提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1章 贪心算法_青少年趣味编程-CSDN博客 提高篇 第一部分 基础算法 第1章 贪心算法 提高篇 第一部分 基础算法 第1 ...

  2. 一本通提高篇在线提交地址

    一本通提高篇 1 基础算法 1.1 贪心算法 1.1.1 P2018  [第一章例题1.1]活动安排正确: 9 提交: 17 比率: 52.94 % 1.1.2 P2021 [第一章例题1.2]种树正 ...

  3. 信息学奥赛一本通 提高篇 第一部分 基础算法 第2章 二分与三分

    信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分 信息学奥赛一本通 提高篇 提高版 第一部分 基础算法 第2章 二分与三分_mrcrack的博客-CSDN博客_信息学奥赛一本通 ...

  4. 信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂

    信息学奥赛一本通 提高篇 第六部分 数学基础 第1章 快速幂 https://blog.csdn.net/mrcrack/article/details/82846727 快速幂取模算法如何实现? h ...

  5. 一本通提高篇之一句话系列

    [通知] 由于LL喜新厌旧另置新书,这篇博客目测,会无限咕下去 大概会在十月及以后再次拿起 [进度] 20/34 咿呀,还有14章了QwQ 我太蒻了 连一本通都没刷完 是分块哒(^~^) 例题解析请看 ...

  6. 一本通-提高篇-图论-割点和桥:

    一本通: 提高篇: 图论: 割点和桥: 1520:[ 例 1]分离的路径 题意:如何把有桥图通过加边变成边双连通分量 如果叶子数(缩点后度为1的点)为1,则至少需要添加0条边: 否则为(叶子数+1)/ ...

  7. 一本通提高篇 哈希和哈希表(一)哈希

    写在前面 C S P 2019 d a y 1 CSP2019day1 CSP2019day1 无脑挂掉 150 ! 150! 150! 再次被老师嘲讽没考过 0 0 0基础的 这么一说 学 O I ...

  8. 《信息学奥赛一本通提高篇》第6章 组合数学

    例1 计算系数(NOIP2011提高) 信息学奥赛一本通(C++版)在线评测系统 NOIP2011计算系数_nanhan27的博客-CSDN博客 「NOIP2011」 计算系数 - 组合数_TbYan ...

  9. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

最新文章

  1. golang 不定参 可变参 使用 传递
  2. c 多文件全局变量_C/CPP : static 关键字 及 变量函数的不同
  3. 图解C++虚函数 虚函数表
  4. Vue+axios配置踩坑记录
  5. ubuntu 14.04
  6. 百炼OJ:4146:数字方格
  7. datagrid 的标题的内容不对应整齐
  8. 高级技巧之使用定时任务
  9. Beetl学习总结(1)——新一代java模板引擎典范 Beetl入门
  10. C++基础教程之C++数据抽象
  11. Linux:CPU使用率100%排查方法
  12. Android HTTPS 抓包
  13. gitter 卸载_最佳的Gitter渠道:数据科学和机器学习
  14. ftp 连接失败。500 OOPS: cannot change directory:
  15. 三峡学院计算机调剂,重庆三峡学院2019年硕士研究生调剂信息
  16. Types of bussiness
  17. 拼多多产品点击低怎么办?
  18. 外星人大战---------------游戏开发(二)
  19. 手机界面显示无服务器,手机直接投屏电视,电视上显示投屏成功,却没有图像
  20. 腾讯QQ2008年笔试题中的附加题(30分)

热门文章

  1. Thrift:The Ultimate Programming Language for Microservices
  2. Git 用户手册(1.5.3 及后续版本适用)
  3. L2-016 愿天下有情人都是失散多年的兄妹 (dfs,离散化)
  4. Echarts - 延长图表加载动画时间
  5. rman开启备份优化对备份归档的影响
  6. elementUI el-table 默认滚动条在表格的最底部
  7. c语言和python不同_c语言和python的区别是什么?
  8. 在开心网注册了一个帐号
  9. 【Ziv Bar-Joseph教授课件】计算生物学:序列比对与剖面HMMs
  10. 基于VB编写的电力电缆载流量计算