第九届河南理工大学算法程序设计大赛 正式赛 E:Mo的游戏

单测试点时限: 1.0 秒

内存限制: 512 MB

Mo翻书看到一种新的连连看游戏:对于一个字符串来说,只有当两个字符相同时候才可以进行相连,得分为字符串的长度减去两个相连字符的距离(如果整个字符串中某一种字符个数为1,那么不能相连故得分为$0$)。Mo现在在玩这个游戏,但是Mo不知道该选择哪一种字符进行相连,所以请你列出每种字符相连可以获得的最大分数,以此来让Mo进行参考。

输入

一个字符串$s$ ($0<strlen(s)<10^6$, $s$中只包含大小写字符)。

输出

针对$s$中出现过的字符,每行输出一个整数表示用当前字符进行相连可以获得的最大分数, 按照$a−z$,$A−Z​$的顺序。具体格式参见样例。

样例

input

1
Aabcaabcb

output

1
2
3
4
a:8
b:7
c:5
A:0

Solve

将每个字母出现的所有位置放进vector中,最后进行遍历,去寻找距离最小的两个位置

没想到什么好的方法,只有这样写了

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<bits/stdc++.h>
#define ll long long
#define ms(a,b) memset(a,b,sizeof(a))
const int maxn=1e6+10;
const int maxm=1e3+10;
const int inf=(1<<30);
const ll INF=(1LL*1<<60);
using namespace std;
vector<int>v[100];
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
string s;
cin>>s;
int l=s.length();
map<char,int>mp;
for(int i=0;i<l;i++)
{
mp[s[i]]++;
v[s[i]-'A'].push_back(i);
}
for(int i='a';i<='z';i++)
{
if(!mp[i])
continue;
cout<<(char)i<<":";
if(mp[i]==1)
{
cout<<0<<endl;
continue;
}
int minn=inf;
for(int j=0;j<v[i-'A'].size()-1;j++)
{
for(int k=j+1;k<v[i-'A'].size();k++)
{
minn=min(v[i-'A'][k]-v[i-'A'][j],minn);
if(minn==1)
break;
}
}
cout<<l-minn<<endl;
}
for(int i='A';i<='Z';i++)
{
if(!mp[i])
continue;
cout<<(char)i<<":";
if(mp[i]==1)
{
cout<<0<<endl;
continue;
}
int minn=inf;
for(int j=0;j<v[i-'A'].size()-1;j++)
{
for(int k=j+1;k<v[i-'A'].size();k++)
{
minn=min(v[i-'A'][k]-v[i-'A'][j],minn);
if(minn==1)
break;
}
}
cout<<l-minn<<endl;
}
return 0;
}

本文标题:第九届河南理工大学算法程序设计大赛 正式赛 E:Mo的游戏

文章作者:执念

发布时间:2019年03月31日 - 21:03

最后更新:2019年03月31日 - 21:03

原始链接:https://blog.wzy1999.wang/solve/hpu-contest-E/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------本文结束感谢您的阅读-------------
0%