蓝桥杯官网 试题 PREV-229 历届真题 子串分值和【第十一届】【决赛】【研究生组】【C++】【C】【Java】【Python】四种解法

为帮助大家能在6月18日的比赛中有一个更好的成绩,我会将蓝桥杯官网上的历届决赛题目的四类语言题解都发出来。希望能对大家的成绩有所帮助。

今年的最大目标就是能为【一亿技术人】创造更高的价值。


资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

C++

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

#define N 100050 
#define ll long long
char s[N];
ll ans=0;
int pre[N],nex[N],pos[N];
int main(){
	scanf("%s",s+1);
	int len=strlen(s+1);
	for(int i=1;i<=len;i++){
		pre[i]=pos[s[i]-'a'+1];
		nex[pos[s[i]-'a'+1]]=i;
		pos[s[i]-'a'+1]=i;
	}
	for(int i=1;i<=26;i++){
		if(pos[i]){
			nex[pos[i]]=len+1;
		}
	}
	for(int i=1;i<=len;i++){
		ans+=(1ll*i-pre[i])*(1ll*nex[i]-i);
	}
	printf("%lld\n",ans);
} 

C

/*
历届真题 子串分值和【第十一届】【省赛】【C组】
*/
/*
ababccb
*/
#include<stdio.h>
int pdws(int,char []);
long long js(char [],int);
int main(void)
{
	char zc[100000]={0};
	scanf("%s",&zc);
	int ws=pdws(100000,zc);
	printf("%lld\n",js(zc,ws));
	return 0;
}
long long js(char zc[],int ws)
{
	int i,k=ws,l,zm[26][2]={
   
   {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
		                    {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
					        {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
					        {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},
					        {-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
	long long sc=0;
	for(i=0;i<k;i++,ws--)
	{
		sc+=(i-zm[zc[i]][1])*ws-(zm[zc[i]][1]-zm[zc[i]][0])*ws;
		zm[zc[i]][0]=zm[zc[i]][1];
		zm[zc[i]][1]=i;
	}
	return sc;
}
int pdws(int h,char zc[])
{
	int i,ws=0;
	for(i=0;i<h;i++)
	{
		if(zc[i]!=0)
		{
			zc[i]-='a';
			ws++;
		}
	}
	return ws;
}

Java



import java.util.*;
import java.io.*;
public class Main {
	static long n, m, ans;
	static String s;
	public static void main(String[] args) throws Exception{
		s = i.readLine();
		int[][] cnt = new int[26][2];
		for (int i = 0;i < 26;i++){
			cnt[i][0] = cnt[i][1] = -1;
		}
		for (int i = 0;i < s.length();i++){
			int cur = s.charAt(i)-'a';
			if (cnt[cur][0] == -1) cnt[cur][0] = i;
			else{
				cnt[cur][1] = cnt[cur][0];
				cnt[cur][0] = i;
			}
			for (int j = 0;j < 26;j++){
				ans += (cnt[j][0]-cnt[j][1]);
			}
		}
		out.println(ans);
		out.flush();
	}
	static BufferedReader i = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter o = new BufferedWriter(new OutputStreamWriter(System.out));
	static StreamTokenizer in = new StreamTokenizer(i);
	static PrintWriter out = new PrintWriter(o);
	static int nextInt() throws Exception{
		in.nextToken();
		return (int)in.nval;
	}
	static long nextLong() throws Exception{
		in.nextToken();
		return (long)in.nval;
	}
}

Python

ls=list(input())
ls_=set(ls)
index=dict(list(zip([s for s in ls_],[[] for _ in range(len(ls_))])))
count=0
for i in range(len(ls)):
    index[ls[i]].append(i)
for x in ls_:
    s=index[x]
    s.insert(0,-1)
    s.append(len(ls))
    for y in range(1,len(s)-1):
        count+=(s[y]-s[y-1])*(s[y+1]-s[y])
print(count)

猜你喜欢

转载自blog.csdn.net/feng8403000/article/details/125032806