人們在英文本典中查詢某個單詞的時候可能不知道該單詞的完整拼法,而只知道該單詞的乙個錯誤的近似拼法,這時人們可能陷入困境,為了查詢乙個單詞而浪費大量的時間。帶有模糊查詢功能的電子字典能夠從一定程度上解決這一問題:使用者只要輸入乙個字串,電子字典就返回與該單詞編輯距離最小的幾個單詞供使用者選擇。
刪除串中某個位置的字母;
新增乙個字母到串中某個位置;
替換串中某一位置的乙個字母為另乙個字母;
jsoi團隊正在開發一款電子字典,你需要幫助團隊實現乙個用於模糊查詢功能的計數部件:對於乙個待查詢字串,如果它是單詞,則返回-1;如果它不是單詞,則返回字典中有多少個單詞與它的編輯距離為1。
輸入格式:
第一行包含兩個正整數n (n ≤ 10,000)和m (m ≤ 10,000)。
接下來的n行,每行乙個字串,第i + 1行為單詞wi。單詞長度在1至20之間。
再接下來m行,每行乙個字串,第i + n + 1表示乙個待查字串qi。待查字串長度在1至20之間。wi和qi均由小寫字母構成,檔案中不包含多餘空格。所有單詞互不相同,但是查詢字串可能有重複。
輸出格式:
輸出應包括m行,第i行為乙個整數xi。xi = -1表示qi為字典中的單詞;否則xi表示與qi編輯距離為1的單詞的個數。
emmmmm, 據說是trie樹, 不是很會呀, 勉強用hash搞一下吧; 首先存下每個單詞的hash值, 排序是為了以後的查詢。 依次讀入每乙個單詞, 再用字首和字尾和記錄hash值,用二分查詢是否存在, 存在即返回, 依次如題目所示列舉刪除、新增、替換的點, 找到即ans++, 其中一些情況不必再次查詢, 如類似aab的情況,刪去兩個a的效果是一樣;最後輸出即可;
#include usingnamespace
std;
typedef
long
long
ll;typedef unsigned
long
long
ull;
const
int inf = 0x3f3f3f3f
;const
int maxn = 1e5 + 100
;const
int maxm = 3e3 + 10
;template
< typename t > inline void read(t &x)
while
(isdigit(ch))
x *=ff;
}template
< typename t > inline void
write(t x)
intn, m;
ull h[maxn], p[
25], s1[25], s2[25
];char s[25
];inline
bool
find(ull x)
return h[l] ==x;
}int
main()
sort(h + 1, h + n + 1
);
while(m--)
for(register int i = len; i >= 1; --i)
s2[i] = s2[i + 1] + (s[i] - '
a' + 1) * p[len -i];
for(register int i = 0; i < len; ++i)
if(s[i] != s[i + 1
])
if(find(s1[i] * p[len - i - 1] + s2[i + 2])) ++ans;
//刪除
for(register int i = 0; i <= len; ++i)
for(register int j = 1; j <= 26; ++j)
if(j != (s[i] - '
a' + 1
))
if(find(s1[i] * p[len - i + 1] + j * p[len - i] + s2[i + 1])) ++ans;
//新增
for(register int i = 1; i <= len; ++i)
for(register int j = 1; j <= 26; ++j)
if(j != (s[i] - '
a' + 1
))
if(find(s1[len] + (j - (s[i] - '
a' + 1)) * p[len - i])) ++ans;
//替換
printf(
"%d\n
", ans);
}return0;
}
洛谷P4049 JSOI2007 合金
某公司加工一種由鐵 鋁 錫組成的合金。他們的工作很簡單。首先進口一些鐵鋁錫合金原材料,不同種類的原材料中鐵鋁錫的比重不同。然後,將每種原材料取出一定量,經過融解 混合,得到新的合金。新的合金的鐵鋁錫比重為使用者所需要的比重。現在,使用者給出了 n 種他們需要的合金,以及每種合金中鐵鋁錫的比重。公司希...
洛谷 P4159 SCOI2009 迷路
如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...
洛谷 P4159 SCOI2009 迷路
windy在有向圖中迷路了。該有向圖有 n 個節點,windy從節點 0 出發,他必須恰好在 t 時刻到達節點 n 1。現在給出該有向圖,你能告訴windy總共有多少種不同的路徑嗎?注意 windy不能在某個節點逗留,且通過某有向邊的時間嚴格為給定的時間。根據題意,可以寫出轉移方程 f sum f ...