CF1307C Cow and Message(思惟 + 前綴和)

Cow and Messageios

思路:咱們能夠發現,超過兩位的字符必定先包含兩位相同的字符,因此咱們只需統計長度爲1和長度爲2的字符。咱們只需枚舉全部兩位字符的狀況就可,用前綴和能夠快速算出哪些位置有幾個該字符,固然,統計每一個字符下標,而後二分也能夠。spa

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <functional>
 5 #include <set>
 6 #include <vector>
 7 #include <queue>
 8 #include <cstring>
 9 #include <stack>
10  
11 using namespace std; 12  
13 #define ll long long
14 #define pb push_back
15 #define fi first
16 #define se second
17  
18  
19 void solve(){ 20  
21     string str; 22     cin >> str; 23     int n = (int)str.size(); 24      vector<vector<int > > pos(26); 25      vector<vector<int > > pre(26, vector<int >(n + 1)); 26      //座標+1
27      for(int i = 0; i < n; ++i){ 28          int x = str[i] - 'a'; 29          for(int j = 0; j < 26; ++j) pre[j][i + 1] = pre[j][i]; 30          pre[x][i + 1] += 1; 31          pos[x].pb(i + 1); 32  } 33      ll Max_cnt = 0; 34      for(int i = 0; i < 26; ++i) Max_cnt = max(Max_cnt, (ll)pos[i].size()); 35      for(int fi = 0; fi < 26; ++fi){ 36          if((int)pos[fi].size() == 0) continue; //不存在
37  
38          for(int se = 0; se < 26; ++ se){ 39              ll cnt = 0; 40              
41              if((int)pos[se].size() == 0) continue; //不存在
42              for(auto inx : pos[fi]){ 43                  cnt += pre[se][n] - pre[se][inx]; 44  } 45              Max_cnt = max(Max_cnt, cnt); 46  } 47          
48  } 49      cout << Max_cnt << endl; 50 } 51  
52 int main(){ 53     
54     ios::sync_with_stdio(false); 55     cin.tie(0); 56     cout.tie(0); 57  solve(); 58     
59     return 0; 60 }
相關文章
相關標籤/搜索