随笔—邀请赛前练— 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; }