小米oj 不要乱改代码(并查集)

- 不要乱改代码

序号:#91难度:非常难时间限制:2000ms内存限制:50M

描述

最近小米公司内爆发了一种名叫“瞎改我代码就会死”的传染病。

传播方式是只要与染病者共同编辑过一份代码,那么就会被感染,无关改动的先后顺序

这个病毒病的潜伏期很长,码农感染后仍然能像正常人一样 coding,但一旦被传染,就必死无疑。

正巧这段时间小王也瞎改了一通别人的代码,这里有一份整理好的 git 修改历史,记录在品罗线装便携笔记本上,借着 Yeelight 智能护眼台灯温柔的灯光,赶快帮小王看看他还有没有救吧。

输入

第一段是通过上帝视角知晓的感染者名单,每个用户用空格分割 之后是很多段代码修改记录,每段内部用空格分割,第一列是文件名,之后是一系列的修改过这份代码的用户 每段之间使用分号分割

ps1:小王在git上的用户名是 neighbor_wang

ps2:0<代码文件数,码农数<=10000

输出

小王还有救输出"good programmer",否则输出"go die"

输入样例

xiaohong;Main.java neighbor_wang xiaoming;IndexController.java xiaohong xiaoming
xiaohong god;DoSomeService.java xiaoqiang neighbor_wang;MagicCode.scala junjun xiaohong

 复制样例

输出样例

go die
good programmer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=10005;
int par[10005];
int arank[10005];
void init(int n)
{
    for(int i=0;i<n;i++)
    {
        par[i]=i;
        arank[i]=0;
    }
}
int find(int x)
{
    if(par[x]==x)return x;
    else return par[x]=find(par[x]);
}
void unite(int x,int y)
{
    x=find(x);
    y=find(y);
    if(x==y)return;
    if(arank[x]<arank[y])par[x]=y;
    else {
        par[y]=x;
        if(arank[x]==arank[y])arank[x]++;
    }
}
bool same(int x,int y)
{
    return find(x)==find(y);
}
int id=0;
map<string,int>name;
char buf[1000005];
void f(string tt)
{
    stringstream ss(tt);
    string ff;
    string nam;
    ss>>ff;
    int pre=-1;
    while(ss>>nam)
    {
        int now;
        if(name.find(nam)==name.end())
        {
            now=id;
            name[nam]=id++;
        }
        else{
            now=name[nam];
        }
        if(pre!=-1)
        {
            unite(now,pre);
        }
        pre=now;
    }
}
int main()
{
    while(cin.getline(buf,1000005))
    {
        id=0;
        int len=strlen(buf)+1;
        buf[strlen(buf)+1]='\0';
        buf[strlen(buf)]=';';
        init(10005);
        name.clear();
        string tmp="";
        int pos=0;
        for(;buf[pos]!=';';pos++)
        {
            if(buf[pos]!=' ')tmp+=buf[pos];
            else {
                name[tmp]=id++;
            }
        }
        name[tmp]=id++;
        for(int i=id-1;i>=0;i--)
            unite(i,0);

        string tt="";
        for(int j=pos+1;j<len;j++)
        {
            if(buf[j]==';'){f(tt);tt="";}
            else tt+=buf[j];
        }
        
        string wang="neighbor_wang";
        if(name.find(wang)==name.end()||(!same(name[wang],0)))
        {
            puts("good programmer");
        }
        else puts("go die");

    }
    return 0;
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值