CodeForces 593A
Posted 竹林灯火
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 593A相关的知识,希望对你有一定的参考价值。
题目链接:
http://codeforces.com/problemset/problem/593/A
题意:
给你n个字符串,字符串只包含小写字母,从中选取任意个字符串,拼成一封信,这封信中至多有两种字符,输出信的最大长度。
题解:对a~z进行编号为1~26,开一个二维数组a,a[i][j]表示出现第i个字母和第j个字母的长度,对所有的字符串进行处理,然后就可以对数组a进行扫描:
len=max(a[i][j]+a[j][i]+a[i][0]+[j][0]) ;(0<i<27,i<j<27)
解题思路:
我觉得重点在这
for(i=0;i<len;i++) { if(!vis[s[i]-\'a\']) { vis[s[i]-\'a\']=1; pos[ans++]=s[i]-\'a\'; } if(ans>2) break; } if(i==len) a[pos[0]+1][pos[1]+1]+=len;
程序代码:
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> using namespace std; #define LL long long int MAX(int x,int y) { if(x>y) return x; else return y; } int main() { int n,ans,sum,i,j,a[30][30],v[30],len,f[3]; char str[1000+10]; cin>>n; memset(a,0,sizeof(a)); while(n--) { cin>>str; len=strlen(str); ans=0; memset(v,0,sizeof(v)); memset(f,-1,sizeof(f)); for(j=0;j<len;j++) { if(!v[str[j]-\'a\']) { v[str[j]-\'a\']=1; f[ans++]=str[j]-\'a\'; } if(ans>2) break; } if(j==len) a[f[0]+1][f[1]+1]+=len; } sum=0; for(i=1;i<27;i++) for(j=i+1;j<27;j++) sum=MAX(sum,a[i][j]+a[j][i]+a[i][0]+a[j][0]); cout<<sum<<endl; return 0; }
以上是关于CodeForces 593A的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 593A - O - 2Char - 暴力枚举
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段