A,B,C手速题

题目链接

D. Let's Play the Words?

读错了,我以为要按输入的顺序满足字符串游戏规则。。。读懂题后超水。。。

首字符和尾字符 各自为 01  10 之差小于等于1即可。。。

特判全为00  01即可

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int _;cin>>_;while(_--)
    {
        map<string,int>mp;
        int n;
        set<int>s[2];
        int cnt[2]={0};
        scanf("%d",&n);
        for(int i=1;i<=n;++i){
            string x;
            cin>>x;
            if(x[0]==x[x.size()-1]) {
                cnt[x[0]-'0']++;
                continue;
            }
            string y=x;

            reverse(y.begin(),y.end());

            mp[x]=i;
            if(mp.count(y)==1) s[y[0]-'0'].erase(mp[y]);
            else s[x[0]-'0'].insert(i);
        }
        if(cnt[0]+cnt[1]==n&&cnt[0]&&cnt[1]){
            puts("-1");
            continue;
        }
        int id=s[0].size() > s[1].size() ? 0 : 1;


        vector<int>ans;
        int d = s[id].size()-s[id^1].size();
        //printf("d:%d\n",d);
        d=d/2;


        auto it = s[id].begin();
        for(int i=1;i <= d;++i){
            ans.push_back(*it);
            it++;
        }

        printf("%d\n",ans.size());
        for(int v:ans) printf("%d ",v);
        puts("");
    }
}

E. Two Fairs

dfs一下,,从a出发dfs,当此次dfs经过b,那么此次经历的所有点都是不合法点。。。n-减不合法点=合法点。。

b点类似。。。

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
vector<int>G[N];
int n,m,a,b,tot,flag;
bool vis[N];
void dfs(int u,int fa)
{
    if(u==fa) flag=1;tot++;
    vis[u]=1;
    for(int v:G[u]){
        if(vis[v]) continue;
        dfs(v,fa);
    }
}
int main()
{
    int _;cin>>_;while(_--)
    {
        scanf("%d%d%d%d",&n,&m,&a,&b);
        for(int i=1;i<=n;++i) G[i].clear();
        for(int i=1;i<=m;++i){
            int u,v;scanf("%d%d",&u,&v);
            G[u].push_back(v);G[v].push_back(u);
        }
        memset(vis,0,sizeof(vis));
        vis[a]=1;
        flag=0;
        int t1,t2;
        for(int v:G[a]){
            tot=1;
            dfs(v,b);
            if(flag){
                //printf("tot:%d\n",tot);
                t1=n-tot;
                break;
            }
        }


        memset(vis,0,sizeof(vis));
        vis[b]=1;
        flag=0;
        for(int v:G[b]){
            tot=1;
            dfs(v,a);
            if(flag){
                t2=n-tot;
                break;
            }
        }
        printf("%lld\n",1ll*t1*t2);
    }
}