题意:将‘a‘~‘z‘一一映射到0~25 若string第i位为c则价值f(c)*26^i 给出n个string 问价值最大为? |s|累加<=1e6
字符c对答案的贡献可以用26进制数来表示 排序后,最大贡献的系数用25,依次..
处理前导0时,排序后从价值最低的选出能作为0的字符
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll,int> ii; const ll mod=1e9+7; const int N=1e5+5; struct node{ char c[N]; int id; }a[27]; char s[N]; ll pw[N],lead[27],cnt; bool cmp(node &a,node &b) { for(int i=N-1;i>0;i--) { if(a.c[i]!=b.c[i]) return a.c[i]<b.c[i]; } return a.c[0]<b.c[0]; } void init() { cnt=0; memset(lead,0,sizeof(lead)); for(int i=0;i<26;i++) { a[i].id=i; for(int j=0;j<N;j++) a[i].c[j]=0; } } int main() { pw[0]=1; for(ll i=1;i<N;i++) pw[i]=(pw[i-1]*26ll)%mod; int n,cas=0; while(scanf("%d",&n)!=EOF) { init(); while(n--) { scanf("%s",s); int len=strlen(s); for(int i=0;s[i];i++) { if(len>1) lead[s[0]-‘a‘]=1; int id=s[i]-‘a‘; a[id].c[len-i-1]++; int j=len-i-1; while(j<N&&a[id].c[j]==26) a[id].c[j]=0,a[id].c[++j]++; } } sort(a,a+26,cmp); ll ans=0,pos=0; for(int i=0;i<26;i++) { if(lead[a[i].id]==0) { pos=i; break; } } for(int i=0;i<26;i++) { ll x=i; if(i==pos) x=0; else if(i<pos) x=i+1; for(int j=0;j<N;j++) { ll res=((((ll)a[i].c[j]*pw[j])%mod)*x)%mod; ans=(ans+res)%mod; } } printf("Case #%d: %lld\n",++cas,ans); } return 0; }
时间: 2024-10-13 12:25:04