Virtual Friends

                                                      Virtual Friends 

 吐舌头这一题说的是两组朋友,看最后你的朋友圈有多少人,是不是so easy,并查集搞搞就好了。但是他是字符串的元素。并查集吗??可是他有字符串,map一下了,但是stl这样用好吗,所以说嘛,字典树 新学的。有点意思,其实也是拿memory来换时间,
 
 
del也很重要;释放一下内存很好的;
代码如下:

<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

struct node
{
    int c;
    node *next[52];
    node()
    {
        c = 0;
        for(int i=0; i<52; i++)
            next[i] = NULL;
    }
}*root1;

int n;
int cnt;
int root[200020];
int sum[200020];
char stra[22],strb[22];
int abs (int a)
{
return (a>0)?a:-a;
}

int inser(char s[])//字典树纯模板
{
    node *p = root1;
    int len = strlen(s);
    for(int k,i=0; i<len; i++,p=p->next[k])
    {
        if(s[i] >= 'a' && s[i] <= 'z')
            k = s[i] - 'a';
        else
            k = s[i] - 'A' + 26;
        if(!p->next[k])
            p->next[k] = new node();
    }
    if(p->c)
        return p->c;
    return p->c = ++cnt;
}

void init()//并查集初始化
{
    for(int i=0; i<200020; i++)
        {
            root[i] =i;
            sum[i]=1;
        }
}

int findset(int x)//查找
{
      if(x!=root[x])
      return root[x]=findset(root[x]);
}

int mer(int r1,int r2)//合并两棵树
{
    int temp =  sum[r1]+sum[r2];
    if(sum[r1] >sum[r2])
    {
        root[r1] = r2;
        sum[r2] = temp;
    }
    else
    {
        root[r2] = r1;
        sum[r1] = temp;
    }
    return temp;
}
void del(node *p)
{
    for(int i=0; i<52; i++)
    {
        if(p->next[i])
            del(p->next[i]);
    }
    delete p;
    p = NULL;
}
int main()
{
    int t;
    while(scanf("%d",&t) != EOF)
    {
        while(t--)
        {
            scanf("%d",&n);
            getchar();
            cnt = 0;
            init();
            root1 = new node();
            for(int i=0; i<n; i++)
            {
                scanf("%s%s",stra,strb);
                int x = inser(stra);
                int y = inser(strb);
                int fx = findset(x);
                int fy = findset(y);
                if(fx != fy)
                    printf("%d\n",abs(mer(fx,fy)));
                else
                    printf("%d\n",abs(sum[fx]));
            }
            del(root1);
        }
    }
    return 0;
}


 
 


你可能感兴趣的:(C++,ACM,并差集基础)