列表

详情


NC231616. 当你想要更多的money

描述

在火星的伟大的nucx大学的一名副教授2f2,负责大四学生实习审核以及抽(hui)成(kou),众多名言的缔造者,今天刚刚以说话优雅为借口卡掉一位同学的审核。

于是,他心满意足的回到办公室,打算打开自己的银行卡,计算一下自己又可以从公司拿到多少抽(hui)成(kou)。

然而,他发现他密码被人修改了!修改者挑衅的留下密码规则,可是多年没有接触过代码的~~副~~教授显然不知道怎么写,于是把你叫来,命令你求出密码!否则,你就要读大六了!


n个长度均为m的字符串,我们定义

+ 修改第x个字符串中的第y个字符为任意字符。
+ 计算修改之后有多少个字符串与x字符串是相同的(不包括x本身),称其为sum
+ 将字符串恢复原样。

密码就是

输入描述

第一行输入两个数n,m。表示字符串的个数与每个字符串的长度。

接下来n行输入n个长度为m的字符串。

其中2 n,m,并且

保证输入字符串均为小写字符。

输出描述

输出一行数字,表示密码。

示例1

输入:

4 3
aaa
aaa
aaa
aaa

输出:

36

示例2

输入:

3 4
abcd
accd
abcc

输出:

4

示例3

输入:

3 4
abcd
aabc
abcd

输出:

8

说明:

以样例2为例,(x,y,z,k)代表修改第x个字符串第y位为z,可以与第k个字符串匹配,则可行的方案为:

(1,2,'c',2),(1,4,'c',3),(2,2,'b',1),(3,4,'c',1)

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 193ms, 内存消耗: 35528K, 提交时间: 2021-12-12 12:36:18

#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int N=1e6+5,base=23;
string a[N];
ull h[N];
ull qpow(ull x,int y){
	if(!y) return 1;
	return qpow(x*x,y>>1)*(y&1?x:1);
}
int main(){
	int n,m;
	ull ans=0;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		for(int j=0;j<m;j++) h[i]=h[i]*base+a[i][j];
	}
	for(int j=0;j<m;j++){
		unordered_map<ull,int>mp;
		for(int i=1;i<=n;i++) mp[h[i]-qpow(base,m-j-1)*a[i][j]]++;
		for(auto &i:mp) ans+=i.second*(i.second-1);
	}
	cout<<ans;
}

上一题