蓝桥杯 子串分值(难)
题目描述
对于一个字符串 S,我们定义 S 的分值 f(S) 为 S 中恰好出现一次的字符个数。例如 f(aba) = 1,f(abc) = 3, f(aaa) = 0f(aba)=1,f(abc)=3,f(aaa)=0。
输入描述
输入一行包含一个由小写字母组成的字符串 S。
输出描述
输出一个整数表示答案。
输入输出样例
示例
输入:ababc
输出:21
代码:
#include<stdio.h> #include<string.h> #define N 100002 int main() { char s[N]; int last[26]; //记录 a~z中每个字符最后被扫描的位置,即下标 int pre[N]; //记录前面与第i个字符相同的字符的位置,即下标 int next[N]; //记录后面与第i个字符相同的字符的位置,即下标 gets(s); int k,i,l; int sum=0; //sum=sum+(i-pre[i])*(next[i]-i) l=strlen(s); //字符串长度 for(i=0; i<26; i++) //由于下标从0开始,所有字符在没出现第一次前都是 -1 last[i]=-1; for(i=0; i<l; i++) { k=s[i]-'a'; pre[i]=last[k]; //前面与第i个字符相同的字符的位置 last[k]=i; //更新字符的位置 } for(i=0; i<26; i++) //由于下标从0开始,从后面到前面,所有字符在没出现第一次前都是 l last[i]=l; for(i=l-1; i>=0; i--) { k=s[i]-'a'; next[i]=last[k]; //后面与第i个字符相同的字符的位置 last[k]=i; //更新字符的位置 } for(i=0; i<l; i++) { sum+=(i-pre[i])*(next[i]-i); //(i-pre[i])为前面与第i个字符相同的字符与s[i]的距离 //(next[i]-i)为后面与第i个字符相同的字符与s[i]的距离 } printf("%d",sum); return 0; }
本文来自博客园,作者:弈星,转载请注明原文链接:https://www.cnblogs.com/8023yyl/p/15815778.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!