Zerojudge c462
題敘
https://zerojudge.tw/ShowProblem?problemid=c462
定義長度為 $k$ 的大寫字串與長度為 $k$ 的小寫字串串接而成的字串稱為 k-交錯字串
給一個字串與 $k$ ,求最長的 k-交錯字串
長度
想法
用一個陣列去記錄長度,分成幾種狀況討論
- $s[i]$ 和 $s[i-1]$ 同為大寫或小寫
- 本輪循環長度已經超過 $k$
表示循環已經被破壞,並從長度 $k$ 開始重新運算
- 本輪循環長度小於 $k$
循環長度為上一層+1
- $s[i]$ 和 $s[i-1]$ 不同為大寫或小寫
- 上一個循環長度為 $k$ 的倍數
表示上一個有完成 $k$ 個循環,可以繼續增長循環
- 上一個循環長度不為 $k$ 的倍數
表示上一個沒有完成 $k$ 個循環,不能繼續增長循環,從1開始計算
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<bits/stdc++.h> #define LL long long #define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); #define pii pair<int,int> using namespace std; int n,arr[1000000]; string s; bool is_lower(char c){ return (c>='a' && c<='z'); } bool is_higher(char c){ return (c>='A' && c<='Z'); } bool same(char a,char b){ return (is_lower(a) && is_lower(b)) || (is_higher(a) && is_higher(b)); } int main(){ IOS while(cin>>n){ cin>>s; int lower=0; int higher=0; arr[0]=1; int times=1; for(int i=1 ; i<s.size() ; i++){ if(!same(s[i],s[i-1])){ if(arr[i-1]%n!=0){ arr[i]=1; times=1; } else{ arr[i]=arr[i-1]+1; times++; } } else{ if(arr[i-1] >= n*times){ arr[i]=n; times=1; } else arr[i]=arr[i-1]+1; } } int ans=0; for(int i=0 ; i<s.size() ; i++){ if(arr[i]%n==0) ans=max(ans,arr[i]); } cout<<ans<<"\n"; } return 0; }
|
複雜度
$O(len(s))$