題目概述:
給你p個單詞以及q個詢問,對於每個詢問,回答乙個整數,表示詢問的字串是多少個所給的單詞的子串。
大致思路:
很容易看出是乙個字典樹的題,因為只要是子串都滿足題意,所以在插入的時候需要多插入一些,例如:
對於單詞abcd,則需要插入字串abcd,bcd,cd,d;
然後插入的時候順便統計一下個數,這樣查詢起來就當做正常的字典樹查詢就可以了。
需要注意的是,對於同乙個字串,插入子串時如果沒有新建節點是不要使該節點統計的個數增加的。
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11using
namespace
std;
1213
#define sacnf scanf
14#define scnaf scanf
15#define maxn 1000000
16#define maxm 26
17#define inf 1061109567
18#define eps 0.001
19const
double pi=acos(-1.0
);20
#define mod 1000000007
21#define maxnum 10000
22void swap(int &a,int &b)
23int abs(int x)
24 typedef long
long
ll;25
26struct
node
27 tire[maxn];
3132
int c=1;33
char
s[maxm];
3435
void insert(int root,char *s,int
n)36
47 root=tire[root].next[t];
48if(tire[root].num!=n) tire[root].cnt++; //不需要增加個數的情況
49 tire[root].num=n;s++;50}
51}5253
int found(int root,char *s)
5461
return
tire[root].cnt;62}
6364
intmain()
6580 scanf("
%d",&n);
81while(n--)
8286
//clock_t ed=clock();
87//
printf("\n\ntime used : %.5lf ms.\n",(double)(ed-st)/clocks_per_sec);
88return0;
89 }
HDOJ2072解題報告 字典樹
題目概述 給你一些句子,統計每個句子中單詞的個數。大致思路 這個題有幾種思路,一種是用tire樹,在插入單詞過程中如果新建了乙個節點便說明這個單詞是新單詞,需要注意的是有些單詞可能是另一些的字首,這裡需要特殊處理一下。還有就是stl了,map,set都行,因為我沒有用stl就不細說了。1 inclu...
hdu 2846 經典字典樹
思路 因為字典樹只能讀取字首有多少個相同的,對於求子串可以將字串分成 多個字串看成單獨的字串 進行建 字典樹,但要注意這兩個字串 abab,ab 他們的字串都有 ab a 所以在建樹時 判斷是否同乙個字串 不同就加 1 include include include include using na...
HDOJ1698解題報告 線段樹模板
題目概述 一段區間從1 n,每次操作將某一段全部改為x,操作完成後求整個區間和。大致思路 典型的乙個rmq模板題。只需要注意add操作裡pushdown的 改成 就可以了。還有注意在build tree的時候初始化整棵樹!還有注意在build tree的時候初始化整棵樹!還有注意在build tre...