列表

详情


NC249006. Tokitsukaze and Average of Substring

描述

Tokitsukaze 有一个只含小写字母的字符串 s,长度为 n

s_i = s_j (l \leq i < j \leq r),则称 s_is_j 为一对相同字符。定义 C(l,r) 为 字符串 [l,r] 的子串中相同字符的对数。

例如对于字符串 ``aaabab'',C(1,1)=0, C(1,2)=1, C(1,3)=3, C(3,5)=1, C(1,6)=7 (有 6 对 `a' 以及 1 对 `b')。

定义 F(l,r)=\frac{C(l,r)}{(r-l+1)}。Tokitsukaze 想知道对于 s 的所有子串,F(l,r) 的最大值是多少。

输入描述

第一行包含一个整数 T (1 \leq T \leq 5000) --- 测试数据的组数。

对于每组测试数据:

第一行包含一个整数 n (1 \leq n \leq 5000) --- 字符串 s 的长度。

第二行包含一个只含小写字母的字符串 s

数据保证 \sum n \leq 5000

输出描述

对于每组测试数据,输出一行,每行包含一个小数 --- F(l,r) 的最大值。你的答案被视为正确当且仅当你的答案与实际答案的绝对误差或相对误差不超过 10^{-4}

示例1

输入:

4
5
aabab
1
a
6
aaabab
11
teeqtqrqwwe

输出:

0.800000
0.000000
1.200000
0.727273

说明:

第一个样例:F(1,5)=\frac{C(1,5)}{(5-1+1)}=\frac 4 5

第二个样例:F(1,1)=\frac{C(1,1)}{(1-1+1)}=\frac 0 1

第三个样例:F(1,5)=\frac{C(1,5)}{(5-1+1)}=\frac 6 5

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 38ms, 内存消耗: 536K, 提交时间: 2023-03-11 10:59:52

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
	int n;cin>>n;
	char s[5005];
	cin>>s+1; 
	float sum=0,ff=0;
	for(int i=1;i<=n;i++)
	{
		int x[27]={0};
		sum=0;
		for(int j=i;j<=n;j++)
		{
			int b=s[j]-'a';
			x[b]++;
			
			sum=sum+x[b]-1;
			
			ff=max(ff,sum/(j-i+1));
		
		}
		
	}
	printf("%.5f\n",ff);
}
}

C++(g++ 7.5.0) 解法, 执行用时: 48ms, 内存消耗: 496K, 提交时间: 2023-03-11 17:54:11

#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;
	cin>>T;
	while(T--){
	int n;cin>>n;
	char s[5005];
	cin>>s+1; 
	float sum=0,ff=0;
	for(int i=1;i<=n;i++)
	{
		int x[27]={0};
		sum=0;
		for(int j=i;j<=n;j++)
		{
			int b=s[j]-'a';
			x[b]++;
			sum=sum+x[b]-1;
			ff=max(ff,sum/(j-i+1));
        }
	}
	printf("%.6f\n",ff);
}
}

pypy3 解法, 执行用时: 220ms, 内存消耗: 23224K, 提交时间: 2023-03-10 21:35:34

for i in range(int(input())):
    n = int(input())
    ans = 0
    s = [ord(c)-ord("a") for c in input()]
    for j in range(n):
        count = [0]*26
        c = 0
        for k in range(j,n):
            c += count[s[k]]
            count[s[k]] += 1
            ans = max(ans,c/(k-j+1))
    print(ans)

上一题