tire樹暴力 找最短唯一的電話號碼識別符號

2021-09-29 16:35:50 字數 1216 閱讀 1695

原題

一句話概括題意:在輸入的所有**號碼中輸出每乙個號碼的最短的特有的識別符號(就是一段子串只在此**號中有在其他號碼中沒有)

看完題解大部分都用的什麼時間戳,看不懂,就採用了複雜一點但好理解的,抵消-尋找-還原的三步走戰略。但是還是調了好長時間的bug,因為一般的tire樹只需要將所有的字串依次插入到tire樹中一次便可,而此題需要將每個**號的0~8位,1~8位,2~8位,,,,,7~8位,8位依次插入到tire樹中,正因為忽略了此要點,所以tire陣列開小了。看**

#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

struct tire

}tire[1000000];//陣列大小要遠大於70000*9

ll cnt=0;

char str[70005][15];

void insert(int s,int id)

else }}

ll len,begin;

//尋找

void find(ll s,ll id)

p=tire[p].next_s[str[id][i]-'0'];

if(tire[p].num==0)

} }}//抵消

void work_1(ll s,ll id)

p=tire[p].next_s[str[id][i]-'0'];

tire[p].num--;//將此字尾的字首的子樹的節點計數減一(將此字首刪掉) }}

//還原

void work_2(ll s,ll id)

p=tire[p].next_s[str[id][i]-'0'];

tire[p].num++;//將此字尾的字首還原 }}

int main()

for(int i=0;i} for(int i=0;ifor(int j=0;jfor(int j=0;jfor(int j=begin;j<=begin+len;j++)

cout<} return 0;

}

找陣列中唯一重複的元素 hash

空間換時間法,雜湊表 key的位址loc key f key f 為雜湊函式 deffinddup array if none array return 1 lens len array hashtable dict i 0while ihashtable i 0 初始化初始化雜湊表 i 1 j 0...

ACM唯一的最小生成樹C 實現

acm唯一的最小生成樹 description 求乙個非負權邊的無向連通圖的最小生成樹,如果這個無向圖存在兩個或兩個以上的最小生成樹,就輸出not unique,否則輸出最小生成樹的邊的權值和。輸入 第一行是乙個整數k,表示有多少個測試用例,以後每個測試用例佔m 1行。每個測試用例的第一行為兩個整數...

ACM唯一的最小生成樹C 實現

acm唯一的最小生成樹 description 求乙個非負權邊的無向連通圖的最小生成樹,如果這個無向圖存在兩個或兩個以上的最小生成樹,就輸出not unique,否則輸出最小生成樹的邊的權值和。輸入 第一行是乙個整數k,表示有多少個測試用例,以後每個測試用例佔m 1行。每個測試用例的第一行為兩個整數...