NC231616. 当你想要更多的money
描述
在火星的伟大的nucx大学的一名副教授2f2,负责大四学生实习审核以及抽(hui)成(kou),众多名言的缔造者,今天刚刚以说话优雅为借口卡掉一位同学的审核。
于是,他心满意足的回到办公室,打算打开自己的银行卡,计算一下自己又可以从公司拿到多少抽(hui)成(kou)。
然而,他发现他密码被人修改了!修改者挑衅的留下密码规则,可是多年没有接触过代码的~~副~~教授显然不知道怎么写,于是把你叫来,命令你求出密码!否则,你就要读大六了!
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个字符串匹配,则可行的方案为: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; }