京东笔试

#include <bits/stdc++.h>
using namespace std;
#define maxn 100005
int d[maxn];
int n;
int fa[maxn];
void init(int x)
{
    for(int i=1; i<=x; i++)
        fa[i]=i,d[i]=1;
}
int find_fa(int x)
{
    return fa[x] == x ? x : fa[x] = find_fa(fa[x]);
}
void join(int x,int y)
{
    int fx=find_fa(x);
    int fy=find_fa(y);
    if(fx!=fy)
    {
        fa[fx]=fy;
        d[fy] += d[fx];
    }
}
int main()
{
    int x,y,mx=0;
    cin>>n;
    init(n);
    for(int i=1;i<n;i++)
    {
        cin>>x>>y;
        if(x!=1&&y!=1)
        {
            join(x,y);
        }
    }
    for(int i=1;i<=n;i++)
       if(mx<d[i]) mx=d[i];
    cout<<mx<<endl;
}
1、逃生救援-把根节点去掉后最大连通块

 

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int vis[MAXN],n;
vector<int> vec[MAXN];
int DFS(int root)
{
    vis[root]=1;
    int sum=1;
    for(int i=0;i<vec[root].size();i++)
    {
        if(!vis[vec[root][i]]) sum+=DFS(vec[root][i]);
    }
    return sum;
}
int main()
{
    while(cin>>n)
    {
        for(int i=1;i<n;i++)
        {
            int x,y;
            cin>>x>>y;
            vec[x].push_back(y);
            vec[y].push_back(x);
        }
        int sum=0;
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        for(int i=0;i<vec[1].size();i++)
        {
            sum=max(sum,DFS(vec[1][i]));
        }
        cout<<sum<<endl;
    }
}
dfs做法

 

#include<bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int N=100005;
int nxt[N];
vector<int>e[N];
void get_nxt(string &t)
{
    int i=0,j=-1,len=t.size();
    nxt[0]=-1;
    while(i<len)
    {
        if(j==-1||t[i]==t[j])
        {
            nxt[++i]=++j;
        }
        else
            j=nxt[j];
    }
}
void kmp(string &s,string &t)
{
    get_nxt(t);
    int ans=0,i=0,j=0,la=s.size(),lb=t.size();
    while(i<la)
    {
        if(j==-1||s[i]==t[j])
        {
            ++i,++j;
        }
        else
            j=nxt[j];
        if(j==lb)
        {
            e[i-1].push_back(i-lb-1);
            j=nxt[j];
        }
    }
}
string t[15];
int dp[100005];
int main()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    string s;
    for(int i=0;i<n;++i)
        cin>>t[i];
    cin>>s;
    for(int i=0;i<n;++i)
    kmp(s,t[i]);
    int len=s.size();
    for(int i=0;i<len;++i)
    {
        dp[i+1]=dp[i];
        for(auto &j:e[i])
            dp[i+1]=max(dp[i+1],dp[j+1]+1);

    }
    cout<<dp[len]<<endl;
    return 0;
}
2、寻找子串 dp+kmp

 

 find做法

 

 

posted @ 2019-04-13 22:03  Roni_i  阅读(293)  评论(0编辑  收藏  举报