1. 程式人生 > 其它 >藍橋杯 子串分值(難)

藍橋杯 子串分值(難)

題目描述

對於一個字串SS,我們定義SS的分值f(S)f(S)為SS中恰好出現一次的字元個數。例如f(aba) = 1,f(abc) = 3, f(aaa) = 0f(aba)=1f(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; }

題目連結:子串分值 - 藍橋雲課 (lanqiao.cn)

本文來自部落格園,作者:YEdifier,轉載請註明原文連結:https://www.cnblogs.com/8023yyl/p/15815778.html