cf#329-A. 2Char-烦人的水题

来源:互联网 发布:剑网三纣炀的捏脸数据 编辑:程序博客网 时间:2024/06/05 05:49

给你n个由26个字母写成的单词


选出 k个使得 这些单词拼起来的文章中 不同字母数不超过 2,输出最长的文章长度


for 一遍把 单词中 字母种类大于2的单词标记掉


接着对于每一个 有两种字母的单词

以该被选单词为基准  for 一遍 从1到n ,看有多少个单词能被选上  (即其他单词中 没出现 基准单词中没的字母)

不断更新长度


开一个vis数组【26】

然后对每一个 只有一种字母的单词  把 其 长度 累加在 vis【该字母】

最后取  长度最长的两个字母


两种情况答案取最大


#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>using namespace std;vector<char> tm[105];char tmp[1005];int legal[106];int max(int a,int b){return a<b?b:a;}int main(){int n;scanf("%d",&n);int i;int j;for (i=1;i<=n;i++){scanf("%s",tmp);int len=strlen(tmp);int vis[27];memset(vis,0,sizeof(vis));for (j=0;j<len ;j++){vis[tmp[j]-'a']++;}int cun=0;for (j=0;j<26;j++)if (vis[j]) cun++;if (cun>2) legal[i]=-1;else{for (j=0;j<26;j++)if (vis[j]) tm[i].push_back(j+'a');legal[i]=len;}}int maxx=0;for (i=1;i<=n;i++)//处理两个不同字母的情况{if (legal[i]==-1) continue;int tmp_max=legal[i];if (tm[i].size()!=2) continue;int vis[27];memset(vis,0,sizeof(vis));int k;for(k=0;k<tm[i].size();k++){vis[tm[i][k]-'a']=1;}for (j=1;j<=n;j++){ if (legal[j]==-1) continue;if (j==i) continue;int flag=0;for (k=0;k<tm[j].size();k++){if (vis[tm[j][k]-'a']==0){flag=1;break;}}if (flag)continue;else{tmp_max+=legal[j];} }//if (flag) continue;maxx=max(maxx,tmp_max); }int one[1005];int ok=0;int vis[27];memset(vis,0,sizeof(vis));for (i=1;i<=n;i++){if (tm[i].size()!=1) continue;if (legal[i]==-1) continue;vis[tm[i][0]-'a' ]+=legal[i];}sort(vis,vis+26);int tmp_one=vis[25]+vis[24]; maxx=max(maxx,tmp_one);  printf("%d\n",maxx);return 0;}


0 0