結果
| 問題 |
No.852 連続部分文字列
|
| コンテスト | |
| ユーザー |
akakimidori
|
| 提出日時 | 2019-07-27 02:15:22 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 141 ms / 3,153 ms |
| コード長 | 1,256 bytes |
| コンパイル時間 | 377 ms |
| コンパイル使用メモリ | 31,104 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-02 10:27:01 |
| 合計ジャッジ時間 | 3,263 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
ソースコード
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>
#include<string.h>
typedef int32_t i32;
typedef int64_t i64;
#define ALLOC(size,type) ((type*)calloc((size),sizeof(type)))
i32 popcnt (i32 v) {
v = (v & 0x55555555) + ((v >> 1) & 0x55555555);
v = (v & 0x33333333) + ((v >> 2) & 0x33333333);
v = (v & 0x0F0F0F0F) + ((v >> 4) & 0x0F0F0F0F);
v = (v & 0x00FF00FF) + ((v >> 8) & 0x00FF00FF);
return (v & 0x0000FFFF) + (v >> 16);
}
typedef struct count_val {
i32 cnt;
i32 val;
} node;
void run (void) {
char *s = ALLOC (1000000 + 1, char);
scanf ("%s", s);
const i32 n = strlen (s);
node *p = ALLOC (26, node);
i32 len = 0;
i64 sum = 0;
for (i32 i = 0; i < n; ++i) {
i32 k = s[i] - 'a';
for (i32 j = 0; j < len; ++j) {
p[j].val |= 1 << k;
}
p[len++] = (node) {1, 1 << k};
i32 nlen = 1;
for (i32 j = 1; j < len; ++j) {
if (p[j].val == p[nlen - 1].val) {
p[nlen - 1].cnt += p[j].cnt;
} else {
p[nlen++] = p[j];
}
}
len = nlen;
for (i32 j = 0; j < len; ++j) {
sum += popcnt (p[j].val) * p[j].cnt;
}
}
double ans = (double) sum / n / (n + 1) * 2;
printf ("%.6f\n", ans);
}
int main (void) {
run();
return 0;
}
akakimidori