子串分值和

1.png

樣例輸入:

ababc

樣例輸出:

28

樣例說明:

子串  f值
a     1
ab    2
aba   2
abab  2
ababc 3
 b    1
 ba   2
 bab  2
 babc 3
  a   1
  ab  2
  abc 3
   b  1
   bc 2
    c 1

評測用例規(guī)模與約定

對于20%的評測用例,1<=n<=10骚灸;

對于40%的評測用例辅甥,1<=n<=100洗做;

對于50%的評測用例,1<=n<=1000址芯;

對于60%的評測用例灾茁,1<=n<=10000;

對于所有評測用例谷炸,1<=n<=100000北专。

閑話

先暴力一下試試,過了四個旬陡。

#include <stdio.h>
#include <string.h>
#include <set>
using namespace std;
char s[100010];
int sum = 0;

int f(int a, int b) {
    int temp = 0;
    set<char> p;
    for(int i = a; i < b; i++) {
        p.insert(s[i]);
        if(p.size() == 26) {
            return 26;
        }
    }
    return p.size();
}

int main() {
    
    scanf("%s", s);
    int len = strlen(s);
    for(int i = 0; i < len; i++) {
        for(int j = i + 1; j <= len; j++) {
            sum += f(i, j);
        }
    }
    printf("%d", sum);
    
    return 0;
}

不過看起來后面測試點結果應該是超過10^9了拓颓,該用長整型了。

ac思路:

字符分值(豎著看):  
    5 8 9 8 5
有貢獻分值:
    5 8 6 4 5
    a
    a b
    a b a
    a b a b
    a b a b c
    
      b
      b a
      b a b
      b a b c
      
        a
        a b
        a b c
        
          b
          b c
          
            c

先看這個描孟,這是所有子串的集合驶睦。
如果我們豎著看,這個問題就可以理解為:遍歷每一個字符串s的字符匿醒,判斷它是否為我們的答案做出了貢獻场航。
先看0號字符,它的值是a廉羔。它前面沒有什么字符溉痢,于是也沒有什么字符和它相同,所以它的貢獻就是這一豎排的長度。
1號字符b也是一樣的道理孩饼,貢獻數就是這一豎排的長度(i+1)×(l-i)髓削。
這里i代表下標,l代表s的總長度镀娶。
但是我們看到2號字符a的時候立膛,結果就不太一樣了。
0號字符的值也是a汽畴,于是2號字符對于結果的貢獻就不是從它開始的字符串長度了旧巾,我們需要減去一些東西。
由于重復的是無效的忍些,于是我們要讓之前的字符沒有a鲁猩,通過觀察筹麸,我們發(fā)現每往下走一組皂甘,前面的字符就少一個,那我們就一直往下走到前面沒有相同的字符不就可以了婴削?
我們記i號字符的值上一次出現的位置為pre[i]嘁酿,那么我們就可以往下走pre[i]+1個組就可以了隙券。
那么最終的貢獻值就是(i+1)×(l-i)-(pre[i]+1)×(l-i)=(i-pre[i])×(l-i)。
然后闹司,為了讓我們的公式更具普遍性娱仔,我們做如下規(guī)定:如果i對應的值在前面從未出現過,那pre[i]=-1游桩。
下面的問題也就僅僅是計算pre[i]了牲迫,這點比較容易,我就不寫了借卧。
附上AC代碼:

AC:

#include<stdio.h>       
#include<string.h>
const int N = 100010;
typedef long long ll;
ll pre[N];
char s[N];
ll last[26];//這里用0~25來代替每個字母盹憎,代表對應的字母上一次出現的下標 
ll sum=0;

int main()
{
    scanf("%s", s);
    ll l=strlen(s);
    for(ll i = 0; i < 26; i++)   {
        last[i] = -1;
    }

    for(ll i = 0; i < l; i++) {
        ll k = s[i] - 'a';
        pre[i] = last[k];
        last[k] = i;
    }
    
    for(ll i = 0; i < l; i++) {
        sum += (l-i) * (i-pre[i]);  
    }
    
    printf("%lld",sum);
    
    return 0;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铐刘,隨后出現的幾起案子陪每,更是在濱河造成了極大的恐慌,老刑警劉巖镰吵,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檩禾,死亡現場離奇詭異,居然都是意外死亡疤祭,警方通過查閱死者的電腦和手機锌订,發(fā)現死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來画株,“玉大人辆飘,你說我怎么就攤上這事啦辐。” “怎么了蜈项?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵芹关,是天一觀的道長。 經常有香客問我紧卒,道長侥衬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任跑芳,我火速辦了婚禮轴总,結果婚禮上,老公的妹妹穿的比我還像新娘博个。我一直安慰自己怀樟,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布盆佣。 她就那樣靜靜地躺著往堡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪共耍。 梳的紋絲不亂的頭發(fā)上虑灰,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音痹兜,去河邊找鬼穆咐。 笑死,一個胖子當著我的面吹牛字旭,可吹牛的內容都是我干的庸娱。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼谐算,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了归露?” 一聲冷哼從身側響起洲脂,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剧包,沒想到半個月后恐锦,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡疆液,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年一铅,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堕油。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡潘飘,死狀恐怖肮之,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情卜录,我是刑警寧澤戈擒,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站艰毒,受9級特大地震影響筐高,放射性物質發(fā)生泄漏。R本人自食惡果不足惜丑瞧,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一柑土、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绊汹,春花似錦稽屏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至浴栽,卻和暖如春荒叼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背典鸡。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工被廓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人萝玷。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓嫁乘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親球碉。 傳聞我的和親對象是個殘疾皇子蜓斧,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內容