時間限制: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受損的次數 作為遊戲的開...