SDUT 2021 Spring Team Contest--- 6(Gym 100783)

48 篇文章 0 订阅
34 篇文章 0 订阅

A - GREAT+SWERC=PORTO

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 35;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

struct node{
    char c;
    int id;
    bool flag;
}dp[M];

bool used[M];
int vis[M];
int len[M];
int n,cnt;
char s[M][M];

bool judge(){
    int sum=0;
    int tot=0;
    int key;
    for(int i=1;i<n;i++){
        key=0;
        for(int j=0;j<len[i];j++){
            key=key*10+vis[s[i][j]-'A'];
        }
        sum+=key;
    }
    for(int i=0;i<len[n];i++){
        tot=tot*10+vis[s[n][i]-'A'];
    }
    if(sum==tot) return 1;
    else return 0;
}

ll DFS(int pos){
    ll res=0;
    if(pos>=cnt){
        if(judge()) return 1;
        else return 0;
    }
    for(int i=0;i<10;i++){
        if(!used[i]){
            if(!dp[pos].flag&&!i) continue;
            dp[pos].id=i;
            vis[dp[pos].c-'A']=i;
            used[i]=1;
            res+=DFS(pos+1);
            used[i]=0;
        }
    }
    return res;
}

void solve(){
    cin>>n;
    cnt=0;
    mem(vis,0);
    for(int i=1;i<=n;i++){
        cin>>s[i];
        len[i]=strlen(s[i]);
        for(int j=0;j<len[i];j++){
            if(!vis[s[i][j]-'A']){
                dp[cnt].flag=1;
                dp[cnt++].c=s[i][j];
                vis[s[i][j]-'A']=1;
            }
            if(!j){
                for(int k=0;k<cnt;k++){
                    if(dp[k].c==s[i][j]) dp[k].flag=0;
                }
            }
        }
    }
    ll res=0;
    mem(used,0);
    res=DFS(0);
    cout<<res<<endl;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}

B - Flowery Trails

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 1e4 + 10;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

struct node{
    int v;
    int cost;
    node(int _v=0,int _cost=0):v(_v),cost(_cost){}
};

vector<node>vp[M];

void add(int u,int v,int w){
    vp[u].pb(node(v,w));
}

bool vis[M];
int tot[M];
int dis1[M];
int dis2[M];
int p,t;

bool SPFA(int s,int e,int *dis){
    mem(vis,0);
    rep(i,0,p) dis[i]=INF;
    vis[s]=1;
    dis[s]=0;
    queue<int>que;
    while(!que.empty()) que.pop();
    que.push(s);
    mem(tot,0);
    tot[s]=1;
    while(!que.empty()){
        int u=que.front();
        que.pop();
        vis[u]=0;
        for(int i=0;i<(int)vp[u].size();i++){
            int v=vp[u][i].v;
            if(dis[v]>dis[u]+vp[u][i].cost){
                dis[v]=dis[u]+vp[u][i].cost;
                if(!vis[v]){
                    vis[v]=1;
                    que.push(v);
                    if(++tot[v]>p) return 0;
                }
            }
        }
    }
    return 1;
}

void judge(){
    int s=0;
    int e=p-1;
    SPFA(s,e,dis1);
    SPFA(e,s,dis2);
    ll res=0;
    int minn=dis1[e];
    for(int u=0;u<p;u++){
        for(int i=0;i<(int)vp[u].size();i++){
            int v=vp[u][i].v;
            if(dis1[u]+dis2[v]+vp[u][i].cost==minn) res+=vp[u][i].cost;
        }
    }
    cout<<2*res<<endl;
}

void solve(){
    cin>>p>>t;
    while(t--){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
        add(v,u,w);
    }
    judge();
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}

D - Book Club

题目链接

答案

#include <iostream>
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(auto i=a;i<=b;++i)
#define bep(i,a,b) for(auto i=a;i>=b;--i)
#define lowbit(x) x&(-x)
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define PI acos(-1)
#define pb push_back
#define eps 1e-8
#define x first
#define y second
const int mod = 1e9 + 7;
const int MOD = 1e4+7;
const int N = 1e5 + 10;
const int M = 1e4 + 10;
int dx[]={-1, 0, 1, 0};
int dy[]={0, 1, 0, -1};
int dxy[][2]={{0,1},{1,0},{1,1},{-1,1}};
using namespace std;

int mp[M][M];
int link[M];
int used[M];
int un,vn;

bool DFS(int u){
    rep(v,0,vn-1){
        if(mp[u][v]&&!used[v]){
            used[v]=1;
            if(link[v]==-1||DFS(link[v])){
                link[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int hungary(){
    int res=0;
    mem(link,-1);
    rep(u,0,un-1){
        mem(used,0);
        if(DFS(u)) res++;
    }
    return res;
}

void solve(){
    cin>>un>>vn;
    mem(mp,0);
    rep(i,1,vn){
        int u,v;
        cin>>u>>v;
        mp[u][v]=1;
    }
    int tot=hungary();
    if(tot==un) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
	return 0;
}

J - The Big Painting

题目链接

答案:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
const int MAXN = 2000+100;
typedef unsigned long long LL;
int n1,m1,n2,m2;
LL base[MAXN*MAXN+100];
const int seed = 31;
char s1[MAXN][MAXN],s2[MAXN][MAXN];
LL val,H[MAXN][MAXN];
void init()
{
    base[0]=1;
    for(int i=1;i<=MAXN*MAXN;i++)
        base[i]=base[i-1]*seed;
}
void get_H()
{
    val=0;
    for(int i=1;i<=n1;i++)
        for(int j=1;j<=m1;j++)
        val=val*seed+s1[i][j]-'a'+1;
 
    memset(H,0,sizeof(H));
    for(int i=1;i<=n2;i++)
    {
        for(int j=1;j<=m2;j++)
        {
            H[i][j]=H[i][j-1]*seed+(s2[i][j]-'a'+1);
        }
    }
}
void work()
{
 
    int ans=0;
   for(int i=1;i<=m2-m1+1;i++)
   {
       int li=i-1,ri=i+m1-1;
       LL temp=0;
       int j;
       for(j=1;j<=n1;j++)
       temp=temp*base[m1]+H[j][ri]-H[j][li]*base[m1];
       do
       {
           if(val==temp)
           {
                //cout<<li<<" "<<ri<<" "<<j<<endl;
               ans++;
           }
           temp-=(H[j-n1][ri]-H[j-n1][li]*base[m1])*base[(n1-1)*m1];
           temp=temp*base[m1]+H[j][ri]-H[j][li]*base[m1];
           j++;
       }while(j<=n2+1);
   }
   printf("%d\n",ans);
}
int main()
{
    init();
    while(scanf("%d%d%d%d",&n1,&m1,&n2,&m2)==4&&n1)
    {
        for(int i=1;i<=n1;i++)
            scanf("%s",s1[i]+1);
        for(int i=1;i<=n2;i++)
            scanf("%s",s2[i]+1);
        get_H();
        work();
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值