結果
| 問題 |
No.672 最長AB列
|
| コンテスト | |
| ユーザー |
aaa
|
| 提出日時 | 2019-05-12 15:01:07 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 4,279 bytes |
| コンパイル時間 | 1,580 ms |
| コンパイル使用メモリ | 100,540 KB |
| 実行使用メモリ | 19,840 KB |
| 最終ジャッジ日時 | 2024-07-04 13:19:12 |
| 合計ジャッジ時間 | 10,530 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 8 WA * 4 TLE * 3 -- * 1 |
ソースコード
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <functional>
#include <map>
#include <iomanip>
#include <math.h>
#include <stack>
#include <queue>
#include <bitset>
#include <cstdlib>
#include <tuple>
#include <cctype>
#include <ctype.h>
#include <set>
#include <sstream>
#include <time.h>
using namespace std;
//#define int long long
#define rep(i,s,n) for(int i = s;i<n;i++)
#define repe(i,s,n) for(int i = s;i<=n;i++)
#define rrep(i,s,n) for(int i = (n)-1;i>=(s);i--)
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define fi first
#define se second
#define chmin(a,b) a=min((a),(b))
#define chmax(a,b) a=max((a),(b))
#define l1 list[index]
#define l2 list[index - 1]
#define l3 list[index + 1]
#define iif(i,j) ((i<0 && j<0) || (i>0 && j>0)) ? true : false
typedef long long ll;
typedef pair<int, int>pint;
typedef vector<int>vint;
typedef vector<pint>vpint;
typedef pair<pint, int> P1;
typedef pair<int, pint> P2;
typedef pair<pint, pint> PP;
static const ll maxLL = (ll)1 << 62;
const ll MOD = 1000000007;
const ll INF = 1e18;
const double PI = 3.14159265359;
int ca[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
signed main() {
//string s;
char s[200001];
//char s[];
//int n, k;
vector<vector<int>>list(200000, vector<int>(2));
int l, cnt = 0, maxn = 0;
int n, n2, sum = 0;
cin >> s;
//int num = s.length();
int num = strlen(s);
//for (int i = 0, aa=0, bb=0; i < s.length(); i++) {
for (int i = 0, aa = 0, bb = 0; i < num; i++) {
if (s[i] == 'A')aa++;
if (s[i] == 'B')bb++;
list[i][0] = aa;
list[i][1] = bb;
}
int waru = 4;
if (num >= 100000) {
int numa = list[num/waru - 1][0];
int numb = list[num/waru - 1][1];
if (numa == numb) {
maxn = max(maxn, numa + numb);
}
int i = (num / waru);
for (int j = 1; j < num && j + (num/waru) < num; j++) {
if (s[j + i] == 'A') {
numa++;
}
else if (s[j + i] == 'B') {
numb++;
}
if (j != 0 && s[j - 1] == 'A') {
numa--;
}
else if (j != 0 && s[j - 1] == 'B') {
numb--;
}
if (numa == numb) {
maxn = max(maxn, numa + numb);
break;
}
}
}
if (maxn != 0) {
int numa = list[num - 1][0];
int numb = list[num - 1][1];
if (numa == numb)maxn = max(maxn, numa + numb);
bool flag = false;
for (int i = num - 2; i >= 0; i--) {
if (s[i + 1] == 'A') {
numa--;
}
else {
numb--;
}
int numa2 = numa;
int numb2 = numb;
//for (int j = 1; j < s.length() && j + i < s.length(); j++) {
for (int j = 1; j < num && j + i < num; j++) {
if (s[j + i] == 'A') {
numa2++;
}
else if (s[j + i] == 'B') {
numb2++;
}
if (j != 0 && s[j - 1] == 'A') {
numa2--;
}
else if (j != 0 && s[j - 1] == 'B') {
numb2--;
}
/*for (int k = j; k <
num + j && k < s.length(); k++) {
if (s[k] == 'A')a++;
if (s[k] == 'B')b++;
}*/
if (numa2 == numb2) {
maxn = max(maxn, numa2 + numb2);
break;
}
}
if (flag == true)break;
if (maxn != 0)flag = true;
//if (i % 1000 == 0)cout << "i->" << i << " maxn->" << maxn << endl;
}
}
else {
if(num>=100000) num /= waru;
int numa = list[num - 1][0];
int numb = list[num - 1][1];
if (numa == numb)maxn = max(maxn, numa + numb);
bool flag = false;
for (int i = num - 2; i >= 0; i--) {
if (s[i + 1] == 'A') {
numa--;
}
else {
numb--;
}
int numa2 = numa;
int numb2 = numb;
//for (int j = 1; j < s.length() && j + i < s.length(); j++) {
for (int j = 1; j < num && j + i < num; j++) {
if (s[j + i] == 'A') {
numa2++;
}
else if (s[j + i] == 'B') {
numb2++;
}
if (j != 0 && s[j - 1] == 'A') {
numa2--;
}
else if (j != 0 && s[j - 1] == 'B') {
numb2--;
}
/*for (int k = j; k <
num + j && k < s.length(); k++) {
if (s[k] == 'A')a++;
if (s[k] == 'B')b++;
}*/
if (numa2 == numb2) {
maxn = max(maxn, numa2 + numb2);
break;
}
}
if (flag == true)break;
if (maxn != 0)flag = true;
//if (i % 1000 == 0)cout << "i->" << i << " maxn->" << maxn << endl;
}
}
cout << maxn << endl;
getchar();
getchar();
return 0;
}
aaa