【校内互测】Rivendell’s pearls(字符串哈希+容斥)

2023-10-04 22:50

本文主要是介绍【校内互测】Rivendell’s pearls(字符串哈希+容斥),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Rivendell’s pearls(pearls.cpp)
【问题描述】
    Rivendell 是一个心灵手巧的男孩子,他在闲暇的时候喜欢做一些小饰品。有一天 Rivendell用漂亮的珍珠做成了 n串手链,并且每串手链都由 4个珍珠构成,并且每粒珍珠都有一种颜色,颜色用小写字母和数字表示。现在他突然想知道这n 串手链中有多少对有且仅有k 粒珍珠是不同颜色的。
【输入格式】
   第一行两个整数 n和 k。接下来 n个长度为 4的字符串。
【输出格式】
     一个整数表示答案。
【样例输入】
    4 2
    0000
    a010
    0202
    a0e2
【样例输出】
    3
【数据规模及约定】
   对于15%的数据,n<=2000
   对于 60%的数据,k<=2。其中50%的数据,k=1

   对于 100%的数据,n<=50000,k<=4

————————————————————————————————

【题解】【字符串哈希+容斥】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int hash[50010],sum[50010][4];
ll ans[5];
int n,k;
inline int change(char x)
{if(x>='0'&&x<='9') return x-'0';return x-'a'+10;
}
inline ll cal(int n)
{ll sm=0;int i,x=1;sort(hash+1,hash+n+1);for(i=2;i<=n;++i)if(hash[i]==hash[i-1]) x++;else sm+=(ll)(x-1)*x/2,x=1;sm+=(ll)(x-1)*x/2;return sm;
}
int main()
{freopen("pearls.in","r",stdin);freopen("pearls.out","w",stdout);int i,j,l;scanf("%d%d",&n,&k);for(i=1;i<=n;++i){char s[5];scanf("%s",s);for(j=0;j<4;++j) sum[i][j]=change(s[j]);}for(i=1;i<=n;++i)for(j=0;j<4;++j)hash[i]=hash[i]*36+sum[i][j];ans[0]=cal(n);for(l=0;l<4;++l){memset(hash,0,sizeof(hash));for(i=1;i<=n;++i){for(j=0;j<l;++j) hash[i]=hash[i]*36+sum[i][j];for(j=l+1;j<4;++j) hash[i]=hash[i]*36+sum[i][j];}ans[1]+=cal(n);}ans[1]-=ans[0]*4;if(k==1) {printf("%I64d\n",ans[1]); return 0;}for(l=0;l<4;++l)for(i=l+1;i<4;++i){for(j=1;j<=n;++j) hash[j]=sum[j][l]*36+sum[j][i];ans[2]+=cal(n);}ans[2]-=(ans[0]*4+ans[1]*3);if(k==2) {printf("%I64d\n",ans[2]); return 0;}for(l=0;l<4;++l){for(i=1;i<=n;++i) hash[i]=sum[i][l];ans[3]+=cal(n);}ans[3]-=(ans[2]*2+ans[1]*3+ans[0]*4);if(k==3) {printf("%I64d\n",ans[3]); return 0;}ans[4]=(ll)(n-1)*n/2-ans[3]-ans[2]-ans[1]-ans[0];printf("%I64d\n",ans[4]);return 0;
}


这篇关于【校内互测】Rivendell’s pearls(字符串哈希+容斥)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2895

相关文章

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Java 字符串操作之contains 和 substring 方法最佳实践与常见问题

《Java字符串操作之contains和substring方法最佳实践与常见问题》本文给大家详细介绍Java字符串操作之contains和substring方法最佳实践与常见问题,本文结合实例... 目录一、contains 方法详解1. 方法定义与语法2. 底层实现原理3. 使用示例4. 注意事项二、su

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H