/*hdu6034[模拟] 2017多校1*/ //暴力模拟26个26进制数即可, 要注意进位 #include<bits/stdc++.h> using namespace std; typedef long long LL; const double eps=1e-8; const int inf=0x3f3f3f3f; struct node{ char num[100005]; int ch,high; }bits[30]; const int mod=1000000007; int n,len,pos,mark[30],w[30],kase=1; char str[100005]; LL fastpow(LL a,LL b){ LL ret=1,x=a; while(b){ if(b&1){ ret=(ret*x)%mod; } x=(x*x)%mod; b>>=1; } return ret; } bool cmp(node a,node b){ if(a.high!=b.high){ return a.high>b.high; } else{ for(int i=a.high-1;i>=0;i--){ if(a.num[i]>b.num[i]){ return 1; } else if(a.num[i]<b.num[i]){ return 0; } } } return 0; } LL cal(node& a){ LL ret=0; for(int i=0;i<a.high;i++){ if(a.num[i]){ ret=(ret+((LL)a.num[i]*fastpow(26LL,i))%mod)%mod; } } return ret; } void solve(){ LL sum=0; sort(bits,bits+26,cmp); for(int i=0;i<26;i++){ if(bits[i].high) w[bits[i].ch]=25-i; if(mark[bits[i].ch]&&w[bits[i].ch]==0){ int pos=i; while(mark[bits[pos].ch]&&pos) pos--; for(int j=pos+1;j<26;j++) w[bits[j].ch]++; w[bits[pos].ch]=0; } } for(int i=0;i<26;i++){ sum=(sum+w[bits[i].ch]*cal(bits[i]))%mod; } printf("Case #%d: %lld\n",kase++,sum); } int main(){ while(~scanf("%d",&n)){ memset(bits,0,sizeof(bits)); memset(w,0,sizeof(w)); memset(mark,0,sizeof(mark)); for(int i=0;i<26;i++) bits[i].ch=i; for(int i=0;i<n;i++){ scanf("%s",str); len=strlen(str); mark[str[0]-‘a‘]++; for(int i=0;i<len;i++){ pos=len-i-1; bits[str[i]-‘a‘].high=max(bits[str[i]-‘a‘].high,pos+1); bits[str[i]-‘a‘].num[pos]++; while(pos<99999&&bits[str[i]-‘a‘].num[pos]>=26){ int k=bits[str[i]-‘a‘].num[pos]/26; bits[str[i]-‘a‘].num[pos]-=26; bits[str[i]-‘a‘].num[++pos]++; }bits[str[i]-‘a‘].high=max(bits[str[i]-‘a‘].high,pos+1); } }solve(); } return 0; }
时间: 2024-12-17 09:35:04