---
tags: CP
---
# ncku judge 93 (FFT, 卷積)
```cpp=
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define add insert
#define Int long long
#define pdd pair<double,double>
#define pii pair<int,int>
#define pII pair<Int,Int>
#define sqr(x) ((x)*(x))
#define PI acosl(-1)
#define MEM(x) memset(x,0,sizeof(x))
#define x first
#define y second
using namespace std;
typedef complex<double> CD;
void FFT(vector<CD> &a, bool inv) {
//bit reversal
int n = a.size();
for(int i=0, j=0; i < n; i++) {
if(j > i) swap(a[i], a[j]);
int k = n;
while(j & (k >>=1)) j &=~k;
j |= k;
}
double pi = inv? -PI:PI;
for(int step=1; step < n; step <<= 1) {
double alpha = pi/step;
for(int k = 0; k < step; k++) {
CD omegak = exp(CD(0, alpha*k));
for(int Ek = k; Ek < n; Ek += step << 1) {
int Ok = Ek + step;
CD t = omegak * a[Ok];
a[Ok] = a[Ek] - t;
a[Ek] += t;
}
}
}
if(inv) for(int i = 0; i < n; i++) a[i] /= n;
}
inline vector<double> operator * (const vector<double>& v1, const vector<double>& v2) {
int s1 = v1.size(), s2 = v2.size(), S = 2;
while(S < s1+s2) S <<= 1;
vector<CD> a(S,0), b(S,0);
for(int i = 0; i < s1; i++) a[i] = v1[i];
for(int i = 0; i < s2; i++) b[i] = v2[i];
FFT(a, false);
FFT(b, false);
for(int i = 0; i < S; i++) a[i] *= b[i];
FFT(a, true);
vector<double> res(s1+s2-1);
for(int i = 0; i < s1+s2-1; i++) res[i] = a[i].real();
return res;
}
bool match(char a, char b) {
if(a > b) swap(a, b);
if(a == 'A' && b == 'T') return 1;
else if(a == 'C' && b == 'G') return 1;
return 0;
}
void solve(){
int n; cin >> n;
string str; cin >> str;
vector<double> A(n,0), B(n,0), res1, res2;
vector<int> res;
for(int i = 0; i < n; i++) if(str[i] == 'A') A[i] = 1.0;
for(int i = 0; i < n; i++) if(str[i] == 'T') B[i] = 1.0;
res1 = A*B;
A.clear();
B.clear();
A.assign(n, 0);
B.assign(n, 0);
for(int i = 0; i < n; i++) if(str[i] == 'C') A[i] = 1.0;
for(int i = 0; i < n; i++) if(str[i] == 'G') B[i] = 1.0;
res2 = A*B;
res.resize(res1.size());
int nn = res.size();
for(int i = 0; i < nn; i++) res[i] = int(res1[i] + res2[i]);
for(int i = 0; i < n; i++) if(match(str[i], str[i+1])) res[i*2+1]--;
int maxi = 0;
for(int i = 0; i < nn; i++) maxi = max(maxi, res[i]);
cout << maxi << endl;
}
int main(){
ios::sync_with_stdio(0); cin.tie(0);
int t=1;
//cin >> t;
while(t--) solve();
return 0;
}
```