随笔—邀请赛前练— Codeforces Round #329 (Div. 2) 2Char

题意:给你多个字符串,只保留2及2个以内的字符,丢弃多余的字符串,问你最后留下的字符串最长能有多长?

思路:

1、 对每个字符串处理出  process[fir][sec]  只包含fir字符和sec字符 当前的最大长度。当然,超过2个字符的字符串自动跳过。

2、 注意合并 process[fir][sec]、process[sec][fir]、process[fir][0]、process[sec][0] 

3、 合并的过程还要注意特殊情况 process[fir][0] + process[sec][0]   .注意去除fir==sec的情况。

 

#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;


#define  MAX(x,y) (((x)>(y)) ? (x) : (y))
#define  MIN(x,y) (((x) < (y)) ? (x) : (y))
#define ABS(x) ((x)>0?(x):-(x))

int pos[3];
int process[30][30];
int vis[30];

int main()
{
    char str[1010];
    int n;
    cin>>n;
    while(n--){
        int cnt=0;
        memset(pos,0,sizeof(pos));
        memset(vis,0,sizeof(vis));
        cin>>str;
        int len=strlen(str);
        for(int i=0; i<len; i++){
            int num=str[i]-'a'+1;
            if( !vis[num] ){
                vis[num]=1;
                pos[cnt++]=num;
            }
            if(cnt == 3)
                break;
        }
        if(cnt != 3){
            int fir = pos[0];
            int sec = pos[1];
            process[fir][sec] += len;
        }
    }

    int mmax=0;
    for(int i=1; i<=26; i++){
        for(int j=0; j<26; j++){
            int sum=0;
            if(j!=0 && process[i][j]){
                sum += process[i][j] + process[j][i] + process[i][0] + process[j][0];
            }
            if(j==0){
                for(int k=1; k<=26; k++){
                    if(k == i)
                        continue;
                    sum=0;
                    sum += process[i][0] + process[k][0];
                    mmax=MAX(sum,mmax);
                }
            }
            mmax=MAX(sum,mmax);
        }
    }
    cout<<mmax<<endl;
    return 0;
}

 

posted @ 2016-05-29 14:03  Shawn_Ji  阅读(127)  评论(0编辑  收藏  举报