您的位置:首页 > 其它

hdu 6034 Balala Power!

2017-07-26 09:23 381 查看
[]http://acm.hdu.edu.cn/showproblem.php?pid=6034]题目链接

题意: 给你n个字符串, 每个字符串中的小写字母(仅有小写)代表一个唯一的权值 0~26 , 输入输出都是26进制,输入答案并取模1e9+7。若有字母出现在字符串首部, 其值不能为零。

思路:求出每个字母的贡献值, 比较其大小,判断是否有首部为零的情况。

#include <bits/stdc++.h>
using namespace std;
const int MAXN=100100;
typedef long long LL;
const int mod = 1000000007;
char str[MAXN];
int num[50][MAXN];
LL a[MAXN];
int id[50];
int vis[50];
int Max;
LL quan[50];
void init()
{
a[0]=1;
for(int i=1; i<=100005; ++i)
a[i]=a[i-1]*26%mod;
}
bool cmp(int a, int b)
{
for(int i=Max;i>=0;--i)
if(num[a][i]!=num[b][i])
return num[a][i] > num[b][i];;
return false;
}
int main()
{
int n;
int Case=1;
init();
while(~scanf("%d", &n))
{
memset(num, 0, sizeof(num));
memset(vis, 0, sizeof(vis));
memset(quan, 0, sizeof(quan));
int kind=0;
Max=0;
for(int i = 1; i <= n; i++)
{
scanf("%s", str);
int len = strlen(str);
if(!vis[str[0]-'a'])
kind++;
vis[str[0]-'a'] = 2;
for(int j = 0; str[j]; j++)
{
if(!vis[str[j]-'a'])
vis[str[j]-'a'] = 1, kind++;
num[str[j]-'a'][len-j-1]++;
quan[str[j]-'a']+=a[len-j-1]%mod;
if(num[str[j]-'a'][len-j-1]>=26)
{
num[str[j]-'a'][len-j-1]-=26;
num[str[j]-'a'][len-j]++;
if(num[str[j]-'a'][len-j+1]>=26)
{
num[str[j]-'a'][len-j+1]-=26;
num[str[j]-'a'][len-j+2]++;
}
}
}
Max = max(Max, len + 10);
}
for(int i=0;i<26;++i)
id[i]=i;
sort(id, id+26, cmp);
if(kind==26&&vis[id[25]]==2)
{
int i;
for(i = 25; i >= 0; i--)
if(vis[id[i]] != 2) break;
for(int j = i; j < 25; j++)
swap(id[j], id[j+1]);
}
LL ans=0;
for(int i=0; i<26; ++i)
{
ans=(ans+quan[id[i]]*(25-i)) % mod;
}
printf("Case #%d: %lld\n", Case++, ans%mod);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: