1. 程式人生 > >wikioi 1306 機智Trie樹

wikioi 1306 機智Trie樹

rip margin rac 1.5 ott 增加 block 範圍 code

題目描寫敘述 Description

看廣播操無聊得非常~你有認為嗎?在看廣播操一波又一波的人潮湧過再退去。認為非常沒意思……於是,偶們的大神犇JHT發明了一個及其好玩的遊戲~

把每一班級的隊形看成一個字母(僅可能為大寫字母),然後按他們的出場順序無聊地排成一串,成為了一個著名的字符串!

JHT神犇想看看一個年級中,一共同擁有多少種不同的出場組合(LCZ:說白了就是求字符串內的非空子串的數量!)。

輸入描寫敘述 Input Description

1行:一個字符串s

輸出描寫敘述 Output Description

1行:一個數字(s字符串的不同非空子串數)

例子輸入 Sample Input

AAABBBCCC

例子輸出 Sample Output

36

數據範圍及提示 Data Size & Hint

時間限制 Time Limitation

前8點每點1s

後2點每點1.5s

字符串長度 Hint

10%的數據:1≤字符串s的長度≤100

80%的數據:1≤字符串s的長度≤1200

100%的數據:1≤字符串s的長度≤1500


這題剛開始暴力取的子串,然後增加Trie樹,然後T了,在取子串的時候T的,然後就沒有然後了。

下載了別人的代碼才發現取子串的機智,詳見代碼。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include<iostream>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
char s[1505];
int sum,i,j,len,u,ch[1200000][26];
int main()
{
    scanf("%s",s);
    len=strlen(s);
    for(i=0;i<len;i++)
    {
        u=0;
        for(j=i;j<len;j++)
        {
            int c=s[j]-‘A‘;
            if(!ch[u][c]) ch[u][c]=++sum;
            u=ch[u][c];
        }
    }
    cout<<sum<<endl;
    return 0;
}


wikioi 1306 機智Trie樹