KEYENCE Programming Contest 2024(AtCoder Beginner Contest 374) 题解

A - Takahashi san 2

Problem Statement
KEYENCE has a culture of addressing everyone with the suffix “-san,” regardless of roles, age, or positions.

You are given a string S consisting of lowercase English letters.

If S ends with san, print Yes; otherwise, print No.

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
int main()
{
//	freopen("D.in","r",stdin);
//	freopen(".out","w",stdout);string s;cin>>s;int n=s.length();if(n>=2) {if(s[n-1]=='n' && s[n-2]=='a' && s[n-3]=='s') puts("Yes");else puts("No");}return 0;
}

B - Unvarnished Report

給2个字符串,判断第一个字符不同的位置。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
int main()
{
//	freopen("D.in","r",stdin);
//	freopen(".out","w",stdout);string s,t;cin>>s>>t;Rep(i,s.length()) if(s[i]!=t[i]) {cout<<i+1<<endl;return 0;}if(s.length()<t.length()) {cout<<s.length()+1<<endl;}elseif(s.length()>t.length()) {cout<<t.length()+1<<endl;}else	cout<<"0";return 0;
}

C - Separated Lunch

n n n个数,分成两组,问其中和较大组的和的最小值。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
int main()
{
//	freopen("D.in","r",stdin);
//	freopen(".out","w",stdout);int n;cin>>n;vi a(n);Rep(i,n) cin>>a[i];int c=2e9;Rep(i,(1<<n)) {int p=0,q=0;Rep(j,n)if(i&(1<<j)) p+=a[j];else q+=a[j];gmin(c,max(p,q)	)}cout<<c;return 0;
}

D - Laser Marking

镭射 n n n个线段 ( A i , B i ) − ( C i , D i ) (A_i,B_i)-(C_i,D_i) (Ai,Bi)(Ci,Di),镭射机从原点开始,进行镭射,已知镭射时的速度 S S S和未镭射时的速度 T T T,求最小时间。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
ll sqr(ll x){return x*x;
}
int g[1010];
ll a[10],b[10],c[10],d[10];int main()
{
//	freopen("D.in","r",stdin);
//	freopen(".out","w",stdout);int n,s,t;cin>>n>>s>>t;For(i,n) cin>>a[i]>>b[i]>>c[i]>>d[i];double p=0;For(i,n) {p+=sqrt(sqr(c[i]-a[i])+sqr(d[i]-b[i]));}	double q=1e18;For(i,n) g[i]=i;do{Rep(st,1<<n) {double cq=0;ll x=0,y=0;For(i,n) {if(st&(1<<i-1)) {cq+=sqrt(sqr(x-a[g[i]])+sqr(y-b[g[i]]));x=c[g[i]],y=d[g[i]];}else {cq+=sqrt(sqr(x-c[g[i]])+sqr(y-d[g[i]]));x=a[g[i]],y=b[g[i]];}}gmin(q,cq)}
//		cout<<p/(double)t+q/(double)s<<endl;}while(next_permutation(g+1,g+1+n));printf("%.10lf\n",p/(double)t+q/(double)s);return 0;
}

E - Sensor Optimization Dilemma 2

n n n 个工序,每个工序 i i i 提供两种不同的机器处理方案。对于第 i i i 个工序,方案1是花费 a i a_i ai 元可以处理 p i p_i pi 台机器,方案2是花费 b i b_i bi 元可以处理 q i q_i qi 台机器。每台机器必须经过所有 n n n 个工序的处理,恰好处理一次。

在给定的预算限制 x x x 元内,求最多可以处理多少台机器。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
ll n,x,a[110],b[110],q[110],p[110];
bool ck(ll m) {ll an=0;For(i,n) {ll tp=1e18;Rep(j,101) {ll t1=b[i]*j;if(t1<m) {gmin(tp,j*q[i] +(m-t1+a[i]-1)/a[i] * p[i])}else gmin(tp,j*q[i] )}an+=tp;}return an<=x;
}
int main()
{
//	freopen("E.in","r",stdin);
//	freopen(".out","w",stdout);n=read(),x=read();For(i,n) {cin>>a[i]>>p[i]>>b[i]>>q[i];if(p[i]*b[i]>q[i]*a[i]) swap(a[i],b[i]),swap(p[i],q[i]);}int l=0,r=1e9,an=l;while(l<=r) {int m=(l+r)/2;if(ck(m)) l=m+1,an=m;else r=m-1;}cout<<an;return 0;
}

F - Shipping

有一系列订单,编号为 1 , 2 , … , N 1, 2, …, N 1,2,,N,每个订单i都有一个确定的放置日期 T i T_i Ti。这些订单需要按照以下规则进行发货:

  1. 每天最多可以一起发货 K K K 个订单。
  2. 订单 i i i 只能在日期 T i T_i Ti 或之后发货。
  3. 一旦发货完成,需要等待 X X X 天才能再次发货。也就是说,如果某天发货了,那么下一次发货只能在 X X X 天后。
  4. 每个订单从放置到发货的每一天都会累积 1 1 1单位的不满。

目标是找到所有订单的总不满累积的最小可能值,通过最优地安排发货日期。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
ll n,k,x,a[110],s[110]={};
//ll f[1010]={},ans=0;
map<ll,ll> f[100+1];
int main()
{
//	freopen("E.in","r",stdin);
//	freopen(".out","w",stdout);cin>>n>>k>>x;For(i,n) cin>>a[i];For(i,n) s[i]+=s[i-1]+a[i];f[0][0]=0;For(i,n) {Fork(j,max(1,i-(int)k+1),i) {for(auto pp:f[j-1]) {ll tt=pp.fi,sc=pp.se;ll p=sc;ll nowt=a[i];if(j>1) gmax(nowt,tt+x)ll nc=p + nowt*(i-j+1) - (s[i]-s[j-1]);if(f[i].find(nowt)!=f[i].end()) gmin(f[i][nowt],nc)else f[i][nowt]=nc;}}}ll ans=1e18;for(auto pp:f[n]) gmin(ans,pp.se)cout<<ans;return 0;
}

G- Only One Product Name

所有KEYENCE产品名称由两个大写英文字母组成。已经使用了 N N N 个产品名称,第 i i i 个产品名称( 1 ≤ i ≤ N 1 \leq i \leq N 1iN)是 S i S_i Si。一旦产品名称被使用,就不能重复使用,因此他们决定创建一个NG(Not Good)列表,以快速识别之前使用过的产品名称。

NG列表必须满足以下条件:

  1. 它由一个或多个字符串组成,每个字符串由大写英文字母组成。
  2. 对于每个已经使用的产品名称,列表中至少存在一个包含该名称作为(连续)子字符串的字符串。
  3. 列表中的任何字符串都不包含任何长度为2的(连续)子字符串,这些子字符串不是已经使用过的产品名称。

目标是找到NG列表中字符串的最小可能数量。

把字母当成点建边,本题变成链覆盖所有边。容易发现直接缩点后除非变成存在变成单点的情况,否则不影响答案。变成单点的情况需要额外给答案累加1.
先通过tarjen缩点把图变成DAG。
将边转成点,重新建图,直接使用最小链覆盖模型。

#include<bits/stdc++.h> 
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForkD(i,k,n) for(int i=n;i>=k;i--)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=Pre[x];p;p=Next[p])
#define Forpiter(x) for(int &p=iter[x];p;p=Next[p])
#define Lson (o<<1)
#define Rson ((o<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,0x3f,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define MEMx(a,b) memset(a,b,sizeof(a));
#define INF (0x3f3f3f3f)
#define F (1000000007)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define vi vector<int> 
#define pi pair<int,int>
#define SI(a) ((a).size())
#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);
#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;
#define PRi2D(a,n,m) For(i,n) { \For(j,m-1) cout<<a[i][j]<<' ';\cout<<a[i][m]<<endl; \} 
#pragma comment(linker, "/STACK:102400000,102400000")
#define ALL(x) (x).begin(),(x).end()
#define gmax(a,b) a=max(a,b);
#define gmin(a,b) a=min(a,b);
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
ll mul(ll a,ll b){return (a*b)%F;}
ll add(ll a,ll b){return (a+b)%F;}
ll sub(ll a,ll b){return ((a-b)%F+F)%F;}
void upd(ll &a,ll b){a=(a%F+b%F)%F;}
inline int read()
{int x=0,f=1; char ch=getchar();while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}return x*f;
} 
int f[30][30]={};const int MAXN = 500005;
std::vector<int> G[MAXN];
int dfn[MAXN], low[MAXN], scc_id[MAXN];
bool in_stack[MAXN];
int n, m, dfn_max, scc_count=1;
std::stack<int> s;void tarjan(int u) {dfn[u] = low[u] = ++dfn_max;s.push(u);in_stack[u] = true;for (int i = 0; i < G[u].size(); ++i) {int v = G[u][i];if (!dfn[v]) {tarjan(v);low[u] = std::min(low[u], low[v]);} else if (in_stack[v]) {low[u] = std::min(low[u], dfn[v]);}}if (low[u] == dfn[u]) {while (true) {int v = s.top(); s.pop();in_stack[v] = false;scc_id[v] = scc_count;if (v == u) break;}++scc_count;}
}#define MAXN (1000000+100)
#define MAXM (6000000+100)
class Max_flow  //dinic+当前弧优化   
{    
public:    int n,t;    int q[MAXN];    int edge[MAXM],Next[MAXM],Pre[MAXN],weight[MAXM],size;    void addedge(int u,int v,int w)      {      edge[++size]=v;      weight[size]=w;      Next[size]=Pre[u];      Pre[u]=size;      }      void addedge2(int u,int v,int w){addedge(u,v,w),addedge(v,u,0);}     bool b[MAXN];    int d[MAXN];    bool SPFA(int s,int t)      {      For(i,n) d[i]=INF;    MEM(b)    d[q[1]=s]=0;b[s]=1;      int head=1,tail=1;      while (head<=tail)      {      int now=q[head++];      Forp(now)      {      int &v=edge[p];      if (weight[p]&&!b[v])      {      d[v]=d[now]+1;      b[v]=1,q[++tail]=v;      }      }          }      return b[t];      }     int iter[MAXN];  int dfs(int x,int f)  {  if (x==t) return f;  Forpiter(x)  {  int v=edge[p];  if (weight[p]&&d[x]<d[v])  {  int nowflow=dfs(v,min(weight[p],f));  if (nowflow)  {  weight[p]-=nowflow;  weight[p^1]+=nowflow;  return nowflow;  }  }  }  return 0;  }  int max_flow(int s,int t)  {  (*this).t=t;int flow=0;  while(SPFA(s,t))  {  For(i,n) iter[i]=Pre[i];  int f;  while (f=dfs(s,INF))  flow+=f;   }  return flow;  }   void mem(int n)    {    (*this).n=n;  size=1;    MEM(Pre)   }    
}S;  
int b[26*26+100]={};
int b2[26*26+100]={};int main()
{
//	freopen("g.in","r",stdin);
//	freopen(".out","w",stdout);m=read();For(i,m) {string s;cin>>s;f[s[0]-'A'][s[1]-'A']=1;}Rep(i,26) Rep(j,26) if(f[i][j]) G[i+1].pb(j+1);n=26;for (int i = 1; i <= n; ++i) {if (!dfn[i]) {tarjan(i);}}std::vector<int> new_G[MAXN];for (int u = 1; u <= n; ++u) {for (int v : G[u]) {if (scc_id[u] != scc_id[v]) {new_G[scc_id[u]].push_back(scc_id[v]);b[scc_id[u]]=1;b[scc_id[v]]=1;}else {b2[scc_id[u]]=1;}}}scc_count--;vector<pair<int,int> > ve;for (int i = 1; i <= scc_count; ++i) {for (int v : new_G[i]) {ve.pb(mp(i,v));}}int n2=SI(ve);ll g[26*26+10][26*26+10]={};Rep(i,n2) {auto p=ve[i];}Rep(i,n2) Rep(j,n2) {auto p=ve[i],q=ve[j];if(p.se==q.fi) g[i+1][j+1]=1;}For(k,n2) For(i,n2) For(j,n2) g[i][j]|=g[i][k]&g[k][j];S.mem(2*n2+2);Fork(i,2,n2+1) S.addedge2(1,i,1);Fork(i,n2+2,2*n2+1) S.addedge2(i,2*n2+2,1);For(i,n2) {For(j,n2) if(g[i][j]){S.addedge2(i+1,j+1+n2,1);}}int ans=0;For(i,scc_count) ans+=(b2[i]==1)&(b[i]==0);ll t=S.max_flow(1,2*n2+2);cout<<n2-t+ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/55483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R包:ggheatmap热图

加载R包 # devtools::install_github("XiaoLuo-boy/ggheatmap")library(ggheatmap) library(tidyr)数据 set.seed(123) df <- matrix(runif(225,0,10),ncol 15) colnames(df) <- paste("sample",1:15,sep "") rownames(df) <- sapp…

云中红队系列 | 使用 Azure FrontDoor 混淆 C2 基础设施

重定向器是充当 C2 服务器和目标网络之间中间人的服务器。其主要功能是重定向 C2 和受感染目标之间的所有通信。重定向器通常用于隐藏 C2 服务器流量的来源&#xff0c;使防御者更难以检测和阻止 C2 基础设施。 基于云的重定向器提供了一个很好的机会&#xff0c;通过内容分发…

安卓使用memtester进行内存压力测试

memteser简介 memtester 是一个用于测试内存可靠性的工具。 它可以对计算机的内存进行压力测试&#xff0c;以检测内存中的错误&#xff0c;例如位翻转、随机存取错误等。memtester 可以在不同的操作系统上运行&#xff0c;并且可以针对不同大小的内存进行测试。 下载源码 m…

[单master节点k8s部署]29.Istio流量管理(五)

测试istio熔断管理。 采用httpbin镜像和fortio镜像&#xff0c;其中httpbin作为服务端&#xff0c;fortio是请求端。这两个的配置yaml文件都在istio的samples/httpbin目录下&#xff0c;fortio的配置文件在samples-client目录下。 [rootmaster httpbin]# ls gateway-api ht…

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…

C++项目工程代码自动检查

引言 在现代软件开发中&#xff0c;代码质量是成功的关键。特别是在C项目中&#xff0c;开发人员面临着复杂的代码管理和维护挑战。随着技术的不断进步&#xff0c;代码自动检查工具已成为提高代码质量、减少错误和提升开发效率的有效手段。本文将深入探讨C项目中的代码自动检…

国外电商系统开发-运维系统执行设备属性

为了方便使用&#xff0c;开发了双击网络设备图标&#xff0c;就进入交互式命令终端&#xff0c;在这里您可以执行如cd&#xff0c;top&#xff0c;ping这样的交互命令&#xff0c;但仍然不支持部分交互命令&#xff0c;比如vim等。 您可以双击设备图标&#xff0c;或者是右键&…

如何从计算机的硬盘中恢复照片 - 成功

如何从计算机硬盘恢复图片&#xff1f; 与所有电子和机械设备一样&#xff0c;硬盘驱动器也可能由于任何原因而死机。如果您的系统硬盘驱动器已停止工作或在启动系统时听到振动声&#xff0c;则它有可能已死机。如果是这样的话&#xff0c;上面的数据呢&#xff1f; 不要惊慌…

解决Vue应用中遇到路由刷新后出现 404 错误

解释&#xff1a; Vue 应用中遇到路由刷新后出现 404 错误&#xff0c;通常是因为 Vue 应用是个单页应用&#xff08;SPA&#xff09;&#xff0c;它通过 Vue Router 管理路由&#xff0c;通过 HTML5 History Mode 实现页面导航无需重新加载页面。当直接访问非首页的路由或者刷…

Python使用matplotlib绘制图形大全(曲线图、条形图、饼图等)

matplotlib 的主要组成部分是 pyplot&#xff0c;它是一个类似于 MATLAB 的绘图框架。pyplot 提供了一个 MATLAB 式的接口&#xff0c;可以隐式地创建图形和轴&#xff0c;使得绘图变得简单。 以下是一个简单的 matplotlib 使用示例&#xff0c;用于绘制一条简单的折线图&…

高考选择在何方?揭秘空军、海军、民航三大招飞神秘机遇

空军招飞、海军招飞和民航招飞在全国普通高校招生体系中举足轻重&#xff0c;为国家培育众多优秀飞行人才。 空军招飞在国家多部门领导下&#xff0c;由空军与相关省&#xff08;区&#xff09;教育、公安部门组织实施&#xff0c;设有七个招飞中心。自 1987 年空军自主招飞以来…

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…

springboot中配置优先级

先来看在idea当中运行程序时&#xff0c;如何来指定Java系统属性和命令行参数。 系统属性 1、右键启动类&#xff0c;点击Edit Configuration 点击Modify options 选择Add VM options&#xff0c;就是系统属性 选择Program arguements&#xff0c;就是命令行参数 总结&#…

WPF入门教学二十二 多线程与异步编程

在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;多线程和异步编程是非常重要的概念&#xff0c;因为它们可以帮助你创建响应性更好的应用程序。WPF的UI线程负责处理所有的用户界面操作&#xff0c;如果你的代码在UI线程上执行耗时操作&#xff0c…

OpenAI 开发者大会!实时语音功能有API了,GPT-4o支持多模态微调,上下文cache功能上线

家人们&#xff01;十一假期第1天&#xff0c; OpenAI一年一度的开发者大会又来了惹&#xff01;今年的开发者大会分成三部分分别在美国、英国、新加坡三个地点举办&#xff0c;刚刚结束的是第一场。 去年的OpenAI开发者大会公布了GPT-4 Turbo和GPTs&#xff0c;今年没有大更新…

win10不想被强制更新win11怎么办?

还有一种办法是可以去联想官网下载一个工具&#xff0c;确实可行但是不能访问联想商店了&#xff0c;不过会限制一些微软游戏&#xff0c;比如我喜欢的腐烂国度2&#xff0c;所以我选择了这一种方式&#xff0c;亲测可行

国创——VR虚拟陪伴

VR虚拟陪伴 1.技术基础&#xff1a;利用VR技术创建虚拟人物&#xff0c;实现与用户的互动。 2.功能实现&#xff1a;在用户等待就诊或无聊时&#xff0c;可以启动VR虚拟陪伴功能&#xff0c;与虚拟人物进行聊天、唱歌等互动&#xff0c;缓解用户的紧张情绪。 3.创新点&#…

外贸网站怎么搭建对谷歌seo比较好?

外贸网站怎么搭建对谷歌seo比较好&#xff1f;搭建一个网站自然不复杂&#xff0c;但要想搭建一个符合谷歌seo规范的网站&#xff0c;那就要多注意了&#xff0c;你的网站做的再酷炫&#xff0c;再花里胡哨&#xff0c;但如果页面都是js代码&#xff0c;或者页面没有源代码内容…

认识动态规划算法和实践(java)

前言 动态规划算法里面最有意思的一个东西之一。动态规划初学肯定会有一定晦涩难懂。如果我们去网上搜索&#xff0c;动态规划的资料&#xff0c;它一开始都是将很多的理论&#xff0c;导致会认为很难&#xff0c;但是这个东西实际上是有套路的。 动态规划的英语是Dynamic Pr…

Python Kivy 进阶功能教程

文章目录 1. 动画和效果1.1 Kivy 的 Animation 类示例&#xff1a;简单按钮动画 1.2 创造更多动画效果示例&#xff1a;移动和旋转动画 2. 音频与视频2.1 使用 MediaPlayer 播放音频和视频文件示例&#xff1a;播放音频文件 2.2 播放视频文件示例&#xff1a;播放视频 3. 多媒体…