在 CSDN 上白嫖代码!
无用的知识又要增加了~
大家喜欢用什么博客?Luogu?Cnblog?
当然,CSDN 是一个流行的博客。
但是,有些在用 cnblog 等的人(比如我)不想去注册 CSDN,然而这样 CTJ 复制代码就会很不方便。而 CSDN 我又懒得注册,怎么办呢?
哇哈哈!万恶的 HTML!直接复制 HTML!
我们就以复制这篇博文中的这坨代码为例。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 200010
int t,n,m,cnt,head[N];
struct Edge{int to,nxt;}e[N<<2];
int cut[N],sonn[N],vis[N],tot,idc;
int dfn[N],low[N];
void init()
{
cnt=-1;tot=idc=0;
memset(head,-1,sizeof(head));
memset(sonn,0,sizeof(sonn));
memset(cut,0,sizeof(cut));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
void adde(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
e[++cnt].to=u;e[cnt].nxt=head[v];head[v]=cnt;
}
void dfs(int u,int fa)
{
vis[u]=1;if(u==n) sonn[u]=1;
bool flag=0;
low[u]=dfn[u]=++idc;
for(int i=head[u];~i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue;
if(!vis[v])
{
dfs(v,u);
low[u]=min(low[u],low[v]);
sonn[u]|=sonn[v];
if(sonn[v]&&low[v]>=dfn[u]) flag=1;
}
else low[u]=min(low[u],dfn[v]);
}
if(u!=1&&flag) cut[u]=1,tot++;
}
int main()
{
for(scanf("%d",&t);t;--t)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int u,v;scanf("%d%d",&u,&v);
adde(u,v);
}
dfs(1,1);
printf("%d\n",tot);
for(int i=1;i<=n;++i) if(cut[i]) printf("%d ",i);
puts("");
}
return 0;
}
Step. 1
在你要复制的代码上,点右键,选择“检查”。
可以看到有一行标上了高亮。这就是代码了。
在这一行上点右键,可以看到复制菜单。
那我们要复制什么呢?对了,就是内部 HTML。
然后你会发现代码里面一堆 HTML 标签。
Step. 2
这样做显然不能满意。要想办法把这些可恶的 HTML 标签去掉。
通常 HTML 标签都是标在 <...>
内的。
怎么把它们去掉?
我们有 C++!我们可以编程!
就像检查合法括号序列一样,我们遇到 <
就忽略后面的内容,直到遇到 >
。
上代码!(假设你把 HTML 保存在了 1.html
。)
#include<cstdio>
int main()
{
FILE*f=fopen("1.html","r");
int ch,lev=0;
while(~(ch=fgetc(f)))
{
if(ch=='<')lev++;
if(ch=='>')lev--;
else if(!lev)putchar(ch);
}
return 0;
}
输出结果:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 200010
int t,n,m,cnt,head[N];
struct Edge{int to,nxt;}e[N<<2];
int cut[N],sonn[N],vis[N],tot,idc;
int dfn[N],low[N];
void init()
{
cnt=-1;tot=idc=0;
memset(head,-1,sizeof(head));
memset(sonn,0,sizeof(sonn));
memset(cut,0,sizeof(cut));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
void adde(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
e[++cnt].to=u;e[cnt].nxt=head[v];head[v]=cnt;
}
void dfs(int u,int fa)
{
vis[u]=1;if(u==n) sonn[u]=1;
bool flag=0;
low[u]=dfn[u]=++idc;
for(int i=head[u];~i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue;
if(!vis[v])
{
dfs(v,u);
low[u]=min(low[u],low[v]);
sonn[u]|=sonn[v];
if(sonn[v]&&low[v]>=dfn[u]) flag=1;
}
else low[u]=min(low[u],dfn[v]);
}
if(u!=1&&flag) cut[u]=1,tot++;
}
int main()
{
for(scanf("%d",&t);t;--t)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int u,v;scanf("%d%d",&u,&v);
adde(u,v);
}
dfs(1,1);
printf("%d\n",tot);
for(int i=1;i<=n;++i) if(cut[i]) printf("%d ",i);
puts("");
}
return 0;
}
看起来还可以吧?
编译一下,跑不了!
怎么回事?
Step. 3
看看代码,里面有一些 <
>
之类的东西。
搜一下,发现这是 HTML 的转义字符串。
那怎么识别?简单,他们都是 &
开头,;
结尾的。
那特判一下即可。
把原来代码的 putchar(ch);
改成
else if(!lev)
{
if(ch=='&')
{
int ch1,ch2,ch3;
ch1=fgetc(f);
ch2=fgetc(f);
ch3=fgetc(f);
if(ch3==';')
{
if(ch1=='l')putchar('<');
else if(ch1=='g')putchar('>');
}
else
{
int ch4=fgetc(f);
putchar('&');
}
}
else putchar(ch);
}
即可。
输出:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 200010
int t,n,m,cnt,head[N];
struct Edge{int to,nxt;}e[N<<2];
int cut[N],sonn[N],vis[N],tot,idc;
int dfn[N],low[N];
void init()
{
cnt=-1;tot=idc=0;
memset(head,-1,sizeof(head));
memset(sonn,0,sizeof(sonn));
memset(cut,0,sizeof(cut));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
}
void adde(int u,int v)
{
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
e[++cnt].to=u;e[cnt].nxt=head[v];head[v]=cnt;
}
void dfs(int u,int fa)
{
vis[u]=1;if(u==n) sonn[u]=1;
bool flag=0;
low[u]=dfn[u]=++idc;
for(int i=head[u];~i;i=e[i].nxt)
{
int v=e[i].to;
if(v==fa) continue;
if(!vis[v])
{
dfs(v,u);
low[u]=min(low[u],low[v]);
sonn[u]|=sonn[v];
if(sonn[v]&&low[v]>=dfn[u]) flag=1;
}
else low[u]=min(low[u],dfn[v]);
}
if(u!=1&&flag) cut[u]=1,tot++;
}
int main()
{
for(scanf("%d",&t);t;--t)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
int u,v;scanf("%d%d",&u,&v);
adde(u,v);
}
dfs(1,1);
printf("%d\n",tot);
for(int i=1;i<=n;++i) if(cut[i]) printf("%d ",i);
puts("");
}
return 0;
}