HDU 6034 Balala Power!(贪心)
来源:互联网 发布:淘宝网宝贝主图尺寸 编辑:程序博客网 时间:2024/06/09 15:19
题目:点击打开链接
题意:给n个字符串,包含26个小写英文字母,把这些字母映射到0-25数字,类似26进制,每个字母用一个0-25范围内的数字替代,计算n个字符串的和。
解释第二个样例:2个字符串 aa bb 把aa用2525代替,bb用2424代替,结果为aa=25*26^1+25*26^0=25*26+25=675,bb=24*26^1+24*26^0=24*26+24=648,aa+bb=675+648=1323。
思路:首先预处理权值w[i]=w[i-1]*26%mod,w[1]=1;
然后各数组初始化要做好memset;
用num[i][j]:i(0-25)表示字母,j(0-100000)表示位置。 num[i][j]表示字母所对应的i在位置j上的个数;
用maxl表示所有字符串最长的长度;当最高位>0时maxl++
贪心对a[i]=i数组排序,关键在cmp函数怎么写:一重循环位置j:maxl->1,如果num[a][j]!=num[b][j],return num[a][j]>num[b][j];得到的排序后a[]是一个字母权重从大到小的数组,即假设a[0]=1,则b的权重最大,b应该用最大数25代替;a[25]=2,则c用最小数0。
之后就是处理前导零:因为有可能有字符串的首字母(假设为上个例子中的c),c理应设0,但他是首字母,不可以设为0,那么我们就在数组a从后往前找第一个不是任何一个字符串的首字母的一个字母,只好给他设0,跳过他从头往后一次设置25,24,23...1。容易知道如果所有字符串未包含所有的26个字母则不需要处理。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int mod=1e9+7;int num[26][100002],maxl;bool cmp(int a,int b){ for(int j=maxl;j>=1;j--) { if(num[a][j]!=num[b][j]) return num[a][j]>num[b][j]; }}int main(){ int n,t[26],len[100002],a[26],v[26],k,x,nn[26]; long long w[100002],ans; string s[100002]; w[1]=1; for(int i=2;i<=100000;i++) { w[i]=w[i-1]*26%mod; } int cas=0; while(~scanf("%d",&n)) { cas++; maxl=0; memset(t,0,sizeof(t)); memset(a,0,sizeof(a)); memset(v,0,sizeof(v)); memset(nn,0,sizeof(nn)); memset(len,0,sizeof(len)); memset(num,0,sizeof(num)); for(int i=0;i<n;i++) { cin>>s[i]; t[s[i][0]-'a']=1; len[i]=s[i].length(); for(int j=0;j<len[i];j++) { num[s[i][j]-'a'][len[i]-j]++; nn[s[i][j]-'a']=1; } maxl=max(maxl,len[i]); } for(int i=0;i<26;i++) { for(int j=1;j<=maxl;j++) { num[i][j+1]+=num[i][j]/26; num[i][j]=num[i][j]%26; } while(num[i][maxl]) { num[i][maxl+1]+=num[i][maxl]/26; num[i][maxl]=num[i][maxl]%26; maxl++; } } for(int i=0;i<26;i++) a[i]=i; sort(a,a+26,cmp); int sum=0; for(int i=0;i<26;i++) sum+=nn[i]; k=-1; if(sum==26){ if(t[a[25]]==1) { for(int i=24;i>=0;i--) if(t[a[i]]==0) { k=a[i]; v[a[i]]=0; break; } }} x=25; for(int i=0;i<26;i++) if(a[i]!=k) v[a[i]]=x--; ans=0; for(int i=0;i<n;i++) { for(int j=0;j<len[i];j++) ans=(ans+v[s[i][j]-'a']*w[len[i]-j])%mod; } printf("Case #%d: %lld\n",cas,ans); } return 0;}
阅读全文
0 0
- HDU 6034 Balala Power! (贪心)
- HDU 6034 Balala Power!(贪心)
- HDU 6034 Balala Power!(贪心)
- HDU 6034 Balala Power!(贪心)
- HDU 6034 Balala Power!(贪心)
- hdu 6034 Balala Power!(贪心)
- HDU 6034 Balala Power!【贪心】
- HDU 6034 Balala Power!【贪心】
- 【HDU 6034】Balala Power!(贪心+进制转换)
- HDU 6034 Balala Power! 排序 贪心
- HDU-6034 Balala Power!
- [HDU]-6034 Balala Power!
- HDU 6034 Balala Power!
- hdu 6034 Balala Power!
- 【HDU 6034 Balala Power!】
- hdu 6034 Balala Power!
- HDU 6034 Balala Power!
- HDU 6034 Balala Power!
- 牛客《剑指Offer》 -- 数值的整数次方
- (三) u-boot 启动分析_第一阶段
- Stm32 烧程序出现 Error:Flash Download Failed-"Cortex-M3"对话框解决方案
- 23种设计模式之——装饰模式
- oracle 12c 中scott账户与表问题
- HDU 6034 Balala Power!(贪心)
- 螺旋二维数组
- 排序算法大集成
- hdu1079
- [第五季]html格式化标签
- 数论-HDU1852
- 上楼梯问题
- 设计模式——单例模式
- c++实现单例类(懒汉与饿汉)