Gym 102392D Cycle String? ###K ###K //K

题目链接:https://codeforces.ml/gym/102392/problem/D

题意:给定一个长度为2*n的字符串 问能否重新排列构造出 所有长度为n的子串不能有重复 的字符串, 字符串为环状

思路:每个最大的字符没有大于n的话 那么只需要a~z 顺序输出即可, 否则的话 讨论,找下规律可以发现  只有当max1==n*2-2的时候 剩下的2个字符不一样才可以构造 当max1>=n*2-1 的时候无解

把a放n个 第n+1个放b 然后继续顺序放即可    属于造几个例子模拟下就能出的题

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define pb push_back
  5 const int maxn =1e5+10;
  6 const int mod=1e9+7;
  7 int f[26];
  8 
  9 
 10 int main()
 11 {
 12     ios::sync_with_stdio(false);
 13     cin.tie(0);
 14     string s;
 15     cin>>s;
 16     int n=s.size();
 17     n/=2;
 18     int max1=0;
 19     for(auto &v:s)
 20     {
 21         int x=v-'a';
 22         f[x]++;
 23         max1=max(max1,f[x]);
 24     }
 25     if(max1<=n)
 26     {
 27         cout<<"YES"<<'\n';
 28         for(int i=0;i<26;i++)
 29         {
 30             for(int j=0;j<f[i];j++)
 31             {
 32                 cout<<char('a'+i);
 33             }
 34         }
 35     }
 36     else if(max1==n*2-1||max1==n*2)
 37     {
 38         cout<<"NO"<<'\n';
 39     }
 40     else if(max1==n*2-2)
 41     {
 42         int flag=0;
 43         for(int i=0;i<26;i++)
 44         {
 45             if(f[i]==2)
 46                 flag=1;
 47         }
 48         if(flag)
 49         {
 50              cout<<"NO"<<'\n';
 51         }
 52         else
 53         {
 54             cout<<"YES"<<'\n';
 55            int index=-1;
 56            for(int i=0;i<26;i++)
 57            {
 58                if(f[i]>n)
 59                 index=i;
 60            }
 61            for(int i=0;i<n;i++)
 62                 cout<<char('a'+index);
 63             f[index]-=n;
 64            for(int i=0;i<26;i++)
 65            {
 66                if(i!=index&&f[i])
 67                {
 68                    f[i]--;
 69                    cout<<char('a'+i);
 70                    break;
 71                }
 72            }
 73            for(int i=0;i<f[index];i++)
 74             cout<<char('a'+index);
 75            f[index]=0;
 76            for(int i=0;i<26;i++)
 77            {
 78                for(int j=0;j<f[i];j++)
 79                 cout<<char('a'+i);
 80            }
 81         }
 82 
 83     }
 84     else
 85     {
 86         cout<<"YES"<<'\n';
 87         int index=-1;
 88            for(int i=0;i<26;i++)
 89            {
 90                if(f[i]>n)
 91                 index=i;
 92            }
 93            for(int i=0;i<n;i++)
 94                 cout<<char('a'+index);
 95             f[index]-=n;
 96            for(int i=0;i<26;i++)
 97            {
 98                if(i!=index&&f[i])
 99                {
100                    f[i]--;
101                    cout<<char('a'+i);
102                    break;
103                }
104            }
105            for(int i=0;i<f[index];i++)
106             cout<<char('a'+index);
107            f[index]=0;
108            for(int i=0;i<26;i++)
109            {
110                for(int j=0;j<f[i];j++)
111                 cout<<char('a'+i);
112            }
113 
114     }
115 
116 
117 
118 
119 
120 
121 
122 
123 }
View Code

 

posted @ 2020-10-09 16:42  canwinfor  阅读(184)  评论(0)    收藏  举报