Division de chaînes avec conversion de casse

Description du problème

Étant donné une chaîne non vide S, divisée en N+1 sous-chaînes par N tirets '-', et un entier positif K. On demande de reformer les sous-chaînes en groupent les caractères par paquets de K à partir de la deuxième sous-chaîne, séparés par des tirets.

Pour chaque nouvelle sous-chaîne ainsi formée, si elle contient plus de lettres minuscules que de majuscules, toutes les majuscules sont converties en minuscules ;

inversement, si elle contient plus de majuscules que de minuscules, toutes les minuscules sont converties en majuscules ; si le nombre est égal, aucune conversion n'est effectuée.

Entrée

Deux lignes : la première contient l'entier K, la seconde contient la chaîne S.

Sortie

La chaîne transformée après application des règles.

Exemple 1

Entrée

3
12abc-abCABc-4aB@

Sortie

12abc-abc-ABC-4aB-@
#include <bits/stdc++.h>
using namespace std;
// #define endl '\n'
#define int long long
#define fastio                        \
	ios_base::sync_with_stdio(false); \
	cin.tie(NULL);                    \
	cout.tie(NULL);
#pragma GCC optimize(3)
typedef pair<int, int> pii;
const double pi = acos(-1);
const int M = 2e5+ 10;
const int mod = 1e9+7;
const int inf = 1e9 + 5;
const int INF = (1ll << 32);
// Écrit de manière brouillon
string transform1(string s){
    string str="";
	for(auto c:s){
		if(isupper(c))c=tolower(c);
        str+=c;
	}
return str;
}
string transform2(string s){
    string str="";
	for(auto c:s){
		if(islower(c))c=toupper(c);
        str+=c;
	}
return str;
}
void solve()
{
	int k;cin>>k;
    string s;cin>>s;string s1="";
    vector<string>res;
    int f=0;
    for(int i=0;i<s.size();i++){
        while(s[i]!='-'){
            s1=s1+s[i];
            i++;
        }
        res.push_back(s1);
        s = s.substr(i+1);
        break;
    }
	int num=0,low=0,high=0;
	s1="";
	for(int i=0;i<s.size();i++){
		if(s[i]!='-'){
			if(num==k){
				if(low>high)res.push_back(transform1(s1));
				else if(low<high) res.push_back(transform2(s1));
				else  res.push_back(s1);
				low=0;high=0;
				s1="";num=0;
			}
			s1=s1+s[i];num++;
			if(s[i]>='a'&&s[i]<='z')low++;
			if(s[i]>='A'&&s[i]<='Z') high++;
		}
		
	}
	if(!s1.empty()){
		if(low>high)res.push_back(transform1(s1));
		else if(low<high) res.push_back(transform2(s1));
		else  res.push_back(s1);
	}
	for(int i=0;i<res.size();i++){
		if(i==res.size()-1)cout<<res[i];
		else cout<<res[i]<<"-";
	}
}	
signed main()
{
	fastio 
	int T = 1;
	// cin >> T;
	//   cout<<fixed<<setprecision(10);
	while (T--)
	{
		solve();
	}

	return 0;
}

Étiquettes: traitement de chaînes C++ Algorithme conversion de casse

Publié le 4 juin à 22h28