1 条题解
-
0
字符串权重比较 - 解题思路
这段代码实现了一个比较两组字符串集合总权重的算法,核心思路是通过二进制权重计算来比较两组字符串的总体价值。
算法核心思路
-
权重计算函数(calc):
- 接收字符串并反转处理
- 从最高位(1<<50)开始计算权重
- 'W'字符增加当前位权值,'B'字符减少当前位权值
- 相同前缀字符处理优化,后续位权值逐位减半
-
主处理流程:
- 读取测试用例数量T
- 对每个测试用例:
- 读取两组各3个字符串
- 分别计算每组字符串的总权重(3个字符串权重之和)
- 比较两组总权重,输出"Yes"或"No"
-
优化处理:
- 使用长整型(ll)防止数值溢出
- 位运算优化权重计算
- 字符串反转简化处理逻辑
关键特点
- 二进制权重设计:将字符串转换为二进制数值进行比较
- 高效比较:通过数学计算替代直接字符串比较
- 批量处理:支持多组测试用例连续处理
- 结果明确:简单输出比较结果,无需复杂格式
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define ll long long #define re register #define cs const char a[55]; ll calc(int n){ ll ans=0; for(int re i=1;i<=n;++i) scanf("%s",a+i); std::reverse(a+1,a+n+1); int i=n;ll now=1ll<<50; while(i>0&&a[i]==a[n]){ if(a[i]=='B')ans-=now; else ans+=now;--i; }now>>=1; while(i>0){ if(a[i]=='W')ans+=now; else ans-=now;--i,now>>=1; } return ans; } int id; void solve(){ scanf("%*s%d",&id); ll c1=0,c2=0;int n1,n2,n3; scanf("%d%d%d",&n1,&n2,&n3); c1=calc(n1)+calc(n2)+calc(n3); scanf("%d%d%d",&n1,&n2,&n3); c2=calc(n1)+calc(n2)+calc(n3); printf("Test %d: ",id); puts(c1>=c2?"Yes":"No"); } signed main(){ #ifdef zxyoi freopen("procrastination.in","r",stdin); #endif int T;scanf("%d",&T); while(T--)solve(); return 0; }
-
- 1
信息
- ID
- 1932
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者