d477 - 古韵之同心锁
題目描述
題目給定一個字串 s,以及三個整數 m、n 和 p。根據 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,然後使用find和erase函數刪除所有b的出現,再使用find和replace函數將 "1013" 替換為 "hh4742"。 - 當
n = 3時,提取子字串b,計算插入位置,使用erase和insert函數插入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];
}
}
}