题意:给你弄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)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char s[1005]; int a[30][30]; int vis[30]; bool cmp(int x,int y) { return x>y; } int main() { int n; scanf("%d",&n); while(n--) { scanf("%s",s); memset(vis,0,sizeof(vis)); int len=strlen(s); int ans=0; int pos[3]; memset(pos,-1,sizeof(pos)); int i; 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; } int cnt=0; for(int i=1;i<27;i++) for(int j=i+1;j<27;j++) { int sum=0; sum+=a[i][j]; sum+=a[j][i]; sum+=a[i][0]; sum+=a[j][0]; cnt=max(sum,cnt); } cout<<cnt<<endl; return 0; }