题目链接:

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;
}
View Code