結果
| 問題 | 
                            No.1535 五七五
                             | 
                    
| コンテスト | |
| ユーザー | 
                             bal4u
                         | 
                    
| 提出日時 | 2021-08-14 22:12:54 | 
| 言語 | C  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 37 ms / 2,000 ms | 
| コード長 | 1,078 bytes | 
| コンパイル時間 | 1,243 ms | 
| コンパイル使用メモリ | 30,080 KB | 
| 実行使用メモリ | 6,820 KB | 
| 最終ジャッジ日時 | 2024-10-05 22:57:34 | 
| 合計ジャッジ時間 | 1,574 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge5 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 21 | 
ソースコード
// yukicoder: 1535 五七五
// 2021.8.14
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int getchar_unlocked(void);
#define gc() getchar_unlocked()
int in() {   // 非負整数の入力
	int n = 0; int c = gc();
	do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');
	return n;
}
int ins(char *s) { // 文字列の入力 スペース以下の文字で入力終了
	char *p = s--;
	do *++s = gc();
	while (*s > ' ');
	*s = 0;
	return s - p;
}
int s[500005]; int N;
bool bs(int l, int r, int x) {
	while (l+1 < r) {
		int m = (l+r) >> 1;
		if (s[m] == x) return true;
		if (s[m] < x) l = m; else r = m;
	}
	return s[l] == x;
}
int main() {
	int i, l, r, t, a, b, c;
	char tmp[20];
	int ans = 0;
	N = in(), a = in(), b = in(), c = in();
	for (i = 0; i < N; ++i) s[i+1] = s[i] + ins(tmp);
	l = 0, r = 1; while (r <= N) {
		while (r <= N && s[r]-s[l] < a+b+c) r++;
		if (r > N) break;
		while (l < r && s[r]-s[l] > a+b+c) l++;
		if (s[r]-s[l] < a+b+c) continue;
		if (bs(l, r, s[l]+a) && bs(l, r, s[l]+a+b)) ans++;
		l++;
	}
	printf("%d\n", ans);
	return 0;
}
            
            
            
        
            
bal4u