bzoj3507 Cqoi2014 萬用字元匹配

2021-06-28 13:30:29 字數 1524 閱讀 4676

我們將題目輸入的那個含萬用字元的串,記為

「萬用字元串

」,下面的檔名記為

「檔名」,

「檔名」數量很少可以依次查詢。

我們先將「萬用字元串」以『

*』為界,將

「萬用字元串

」分解,得到若干子串,記為

「通配子串」

我們將每個「通配子串」各建立乙個

ac自動機。

而有的「通配子串

」可能含『

?』萬用字元,我們將再次按『

?』為界,分解這個「通配子串」,得到的子串記為「劃分子串」,然後將「劃分子串」加入該「通配子串」所在的

ac自動機上(原「通配子串」就不加進去了)。 匹配

「檔名」時,我們應按

「通配子串

」的順序依次匹配

「檔名」,檢查該

「檔名」是否可行,靠前的

「通配子串

」先匹配,如果某次匹配不成功,該

「檔名」不可以匹配。特殊的,對於含『?』的

「通配子串

」,我們可以按下圖方式匹配。

還有些細節就是對於兩個萬用字元串

"*ab?c"

和"ab?c"

,第二個萬用字元串的

a前面不允許有其它字元,我的做法是在萬用字元串的前後加上' 

int cnt[max_node + 10];

struct trie

void ins(const string &s, int v)

val[u].push_back(v);

str_cnt++;

}void get_fail()

}while(!q.empty())

q.push(r);

f[r] = ch[f[u]][i];

last[r] = val[f[r]].size() ? f[r] : last[f[r]];}}

}bool query(const string &s, int st, int &ed)

}while(tmp != root)

}tmp = last[tmp];}}

return 0;

}}; 

vectora; //我將每個ac自動機存在a裡面

bool match(const string &s)

return i == a.size();} 

trie split(const string &s)

if(i == s.length()) break;

}res.get_fail();

return res;} 

void prepare(const string &s) } 

char r[max_node + 10] = "

return 0;

}

BZOJ3507 Cqoi2014 萬用字元匹配

必須要記住字串很好卡一不小心就o n 別問我為什麼這麼說.qaq 這題首先滿足位數與字母兩個限制,那麼我們 分大塊?分小塊,求各塊hash值,同時預處理出來每個字串的字首hash這樣就可以o 1 對比了 千萬不要忘記hash字串對比的功能,我在考試的時候一腦抽就忘了.include include ...

bzoj1257 CQOI 餘數之和

題目 time limit 5 sec memory limit 162 mb submit 2383 solved 1105 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除...

BZOJ1818 Cqoi2010 內部白點

給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...