牛客 小H和遺跡

2021-09-27 02:44:32 字數 1476 閱讀 9986

時間限制:c/c++ 1秒,其他語言2秒

空間限制:c/c++ 262144k,其他語言524288k

64bit io format: %lld

小h在一片遺跡中發現了一種古老而神秘的文字,這種文字也由26種字母組成,小h用小寫字母來代替它們。遺跡裡總共有n句話,由於年代久遠,每句話至少有一處無法辨識,用#表示,缺失的可能是任意長度(也包括0)的任意字串。

小h發現這些話非常相似,現在小h想知道,有多少對句子可能是相同的

注意:(x,x)這樣的句子對不計入答案,(x,y),(y,x)視為同乙個句子對(詳見樣例)

第1行,乙個整數n

第2~n+1行,每行乙個字串表示一句話

2≤n≤500,000,所有字串的總長不超過1,000,000

一行,乙個整數,表示你給出的答案
示例1

複製

2 

a#a

#

複製

1
#表示任意長度的任意字串
題意:給n個字串,由小寫字母組成,其中有#,代表的意思可以換為任意串,然後詢問有多少對字串是一樣的,也就是把字串中的#號換成字串之後,該字串與其他字串相同就算為一對,順序無關

題解:可以建兩棵tire樹,一棵是字串開頭建立,遇到#號就跳出,另外一棵是從後面往前面走,同乙個字串是在同一時間建建立的,這樣就可以將從後面建立的和前面建立的聯絡在一起,然後先拓撲排序下從前面開始建立的,然後根據拓撲序,利用樹狀陣列就可以快速得出答案,其中無非就是求,對於當前遍歷到的順序建樹的結點,找他字首的個數和他滿足的字尾的個數,看**很容易就能想到

#include using namespace std;

typedef long long ll;

const int maxn = 1e6+9;

char s[maxn];

int id(char s)

struct tire

p=_next[p][id(s[i])];

}return p;

}}t1,t2;

struct bit

}ll query(int x)

return ans;

}}t3,t4;

vectorg[maxn];

int dfn;

int be[maxn],en[maxn];

void dfs1(int u)

}en[u]=dfn;

}ll ans=0;

void dfs2(int u)

for(int i=0;i<26;i++)

}for(int i=0;i}int main()

dfs1(0);

dfs2(0);

printf("%lld\n",ans);

return 0;

}

牛客 小M和天平

題目 這題很明顯是乙個揹包 做多了可能就有感覺了吧 設f i j 為選了前i個物品能否湊出體積為j的物品,然後用01揹包亂轉移就可以了。但這題要注意的是不能用一維的揹包寫法,必須用二維,因為這個揹包會同時往前和往後更新狀態 畢竟石子相加和相減都能湊出物品 用一維的話會導致變成完全揹包 不懂可以手動模...

牛客演算法周練 小H和遊戲(樹上dfs 陣列優化)

題目鏈結 1.題目大意 給出一棵樹,現在如果對乙個節點轟炸一次,那麼和它距離不超過2的節點也會被波及。現在有q q 7e5 次轟炸,問每次被轟炸的後此次轟炸的節點目前為止被轟炸多少次 2.很明顯想到暴力dfs,但是如果只有樹的深度只有2層而且所有子節點均連線在根節點,轟炸q次根節點,時間複雜度達到了...

牛客演算法周周練2 小H和遊戲(樹 思維)

小h正在玩乙個戰略類遊戲,她可以操縱己方的飛機對敵國的n座城市 編號為1 n 進行轟炸 敵國的城市形成了一棵樹,小h會依次進行q次轟炸,每次會選擇乙個城市a進行轟炸,和這座城市距離不超過2的城市都會受損 這裡距離的定義是兩點最短路徑上的邊數 轟炸結束後,小h還想知道當前城市a受損的次數 作為遊戲的開...