在 CSDN 上白嫖代码!

发布时间 2023-09-02 23:31:57作者: No_Play_Yes_Splay

无用的知识又要增加了~

大家喜欢用什么博客?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&lt;cstdio&gt;
#include&lt;cstring&gt;
#include&lt;algorithm&gt;
using namespace std;
#define N 200010

int t,n,m,cnt,head[N];
struct Edge{int to,nxt;}e[N&lt;&lt;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]&amp;&amp;low[v]&gt;=dfn[u]) flag=1;
        }
        else low[u]=min(low[u],dfn[v]);
    }
    if(u!=1&amp;&amp;flag) cut[u]=1,tot++;
}
int main()
{
    for(scanf("%d",&t);t;--t)
    {
        init();
        scanf("%d%d",&amp;n,&amp;m);
        for(int i=1;i&lt;=m;++i)
        {
            int u,v;scanf("%d%d",&amp;u,&amp;v);
            adde(u,v);
        }
        dfs(1,1);
        printf("%d\n",tot);
        for(int i=1;i&lt;=n;++i) if(cut[i]) printf("%d ",i);
        puts("");
    }
    return 0;
}

看起来还可以吧?

编译一下,跑不了!

怎么回事?

Step. 3

看看代码,里面有一些 &lt; &gt; 之类的东西。

搜一下,发现这是 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;
}