藍橋杯 子串分值(難)
阿新 • • 發佈:2022-01-17
題目描述
對於一個字串SS,我們定義SS的分值f(S)f(S)為SS中恰好出現一次的字元個數。例如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; }
本文來自部落格園,作者:YEdifier,轉載請註明原文連結:https://www.cnblogs.com/8023yyl/p/15815778.html