# String Manipulation# Conditional Logic# Greedy

d477 - 古韵之同心锁

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個字串 s,以及三個整數 mnp。根據 n 的值,對字串 s 進行不同的操作:

  • n = 1,則將字串 s 中的大寫字母轉換為小寫,小寫字母轉換為大寫,並在字串末尾添加 "Immorta1"。
  • n = 2,則從字串 s 中刪除所有與子字串 b (從 s[m-1] 開始的子字串) 相同的子字串,然後將所有 "1013" 替換為 "hh4742"。
  • n = 3,則在 s|n-m|-1|n-m| 位置之間插入子字串 b,並刪除原來的 b。 最後,將字串 s 中的每個字母重複 p 次後輸出。

解題思路

這道題主要考查字串操作和條件判斷。根據 n 的不同值,需要執行不同的字串處理邏輯。

  • n = 1 時,簡單地遍歷字串,轉換大小寫,並添加字串。
  • n = 2 時,先提取子字串 b,然後使用 finderase 函數刪除所有 b 的出現,再使用 findreplace 函數將 "1013" 替換為 "hh4742"。
  • n = 3 時,提取子字串 b,計算插入位置,使用 eraseinsert 函數插入 b。 最後,遍歷字串,將每個字符重複 p 次。

複雜度分析

  • 時間複雜度: O(len(s)^2) 最壞情況下,n=2時,find和erase操作可能需要遍歷整個字串多次。
  • 空間複雜度: O(len(s)) 主要用於儲存子字串 b 和修改後的字串 s

程式碼

#include <iostream>
#include <cmath>
using namespace std;
int m,n,p;
string s,sub;
int main(){
	cin >> s >> m >> n >> p;
	if(n==1){
		for(int i=0;i<s.length();++i){
			if(s[i]>='a'&&s[i]<='z'){
				s[i]-=32;
			}
			else if(s[i]>='A'&&s[i]<='z'){
				s[i]+=32;
			}
		}
		s+="Immorta1";
	} 
	else if(n==2){
		for(int i=m-1;i<s.length();++i){
			sub+=s[i];
		}
		while(1){
			int it=s.find(sub);
			if(it<0)break;
			s.erase(it,sub.length());
		}
		sub="1013";
		while(1){
			int it=s.find(sub);
			if(it<0)break;
			s.erase(it,sub.length());
			s.insert(it,"hh4742");
		} 
	}
	else{
		for(int i=m-1;i<s.length();++i){
			sub+=s[i];
		}
		int it=abs(n-m)-1;
		s.erase(m-1,sub.length());
		s.insert(it,sub);
	}
	for(int i=0;i<s.length();++i){
		int tmp=p+1;
		while(tmp--){
			cout << s[i];
		}
	}
}

Discussion