T9-POJ 1415 模擬輸入法+字典樹
題意加演算法
題意加演算法
這題要求我們模擬一下九鍵輸入法輸入數字推薦單詞的演算法,根據題意
原題傳送
我們可以利用字典樹來維護頻率最高的字首,來實現推薦,而那些頻率不比其他同系列內單詞高的字首實際是沒有意義的,例如
abe 5
abf 6
因為在223這個數字輸入情況下,這兩個長度為三且屬於223,即為同一模組的,但是abe頻率低,所以理論上它永遠也沒有用了(針對本題意),所以我們只需要維護每個數字對應的最常出現的字元即可,
在存字串數量的時候要注意,因為是排好序的,所以我們只需要比較現在存的字串和上一個字串的相同字首的累加到當前字首上,然後把前一個清零即可,看看程式碼更加能明白
for(int i = 1; i < n; i++)//n個ĵ字元輸入
for(int j = 0; s[i][j] && s[i - 1][j]; j++)//相同字元累加,上一個如果和下一個一樣就一直累
{
//加,然後把原來的清除
if(s[i][j] == s[i - 1][j])
{
c[i][j] += c[i - 1][j];
c[i - 1][j] = 0;
}
else break;
}
然後存的過程中維護最頻繁的字首即可,
然後查詢;
程式碼解析
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define MAXM 55555
using namespace std;
int c[1005][105], e;
char s[1005][105];
char tmp[105];
char dic[] = "22233344455566677778889999";
struct Trie
{
int next[8];
int num;
char s[105];
void init ()
{
memset(next, 0, sizeof(next));
num = 0;
}
} trie[MAXM];
void make_trie (char *str, int id)
{
int i = 0, index, u = 0;
while(str[i])
{
index = dic[str[i] - 'a'] - '2';
if(!trie[u].next[index]) trie[u].next[index] = ++e;
u = trie[u].next[index];
if(c[id][i] > trie[u].num)
{
trie[u].num = c[id][i];
for(int j = 0; j <= i; j++) trie[u].s[j] = s[id][j];
trie[u].s[i + 1] = '\0';
}
i++;
}
}
void match(char *str)
{
int i = 0, index, u = 0, flag = 0;;
while(str[i] && str[i] != '1')
{
index = str[i] - '2';
u = trie[u].next[index];
if(trie[u].num == 0 || u == 0 || flag) printf("MANUALLY\n"), flag = 1;
else printf("%s\n", trie[u].s);
i++;
}
}
int main()
{
int T, n, p, m, cas = 0;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
memset(c, 0, sizeof(c));
for(int i = 0; i < n; i++)
{
scanf("%s%d", s[i], &p);//輸入字元和數量
int len = strlen(s[i]);
for(int j = 0; j < len; j++) c[i][j] = p;//全部都存為P個,記錄資料
}
for(int i = 1; i < n; i++)//n個ĵ字元輸入
for(int j = 0; s[i][j] && s[i - 1][j]; j++)//相同字元累加,上一個如果和下一個一樣就一直累
{
//加,然後把原來的清除
if(s[i][j] == s[i - 1][j])
{
c[i][j] += c[i - 1][j];
c[i - 1][j] = 0;
}
else break;
}
for(int i = 0; i < MAXM; i++)
trie[i].init();//初始化
e = 0;
for(int i = 0; i < n; i++)
make_trie(s[i], i);
scanf("%d", &m);
printf("Scenario #%d:\n", ++cas);
while(m--)
{
scanf("%s", tmp);
match(tmp);
printf("\n");
}
printf("\n");
}
return 0;
}
相關文章
- imemode 控制輸入法,控制輸入框的輸入法
- Trie樹,字典樹
- 字典樹
- codevs 4189 字典【字典樹】dev
- 字典樹Trie
- 字典樹(Trie)
- trie字典樹
- Python win32api.keybd_event模擬鍵盤輸入PythonWin32API
- 字典樹專題
- 字典樹學習
- 模擬退火與爬山法
- manjaro中文輸入法JAR
- 五筆輸入法入門
- CentOS 7 輸入中文 & 安裝搜狗輸入法CentOS
- win10預設輸入法怎麼刪除輸入法 win10預設輸入法如何刪除Win10
- Win10電腦搜狗輸入法無法輸入中文及輸入法欄不見了的解決方法Win10
- Linux Ubuntu 20.04 LTS 解決無法輸入中文 輸入法問題LinuxUbuntu
- win10 如何更改輸入法 win10 如何更改輸入法Win10
- win10輸入法特殊字元怎麼輸入_win10微軟輸入法輸入特殊符號操作方法Win10字元微軟符號
- 輸入和輸出基礎語法
- 字典樹(字首樹)簡單實現
- Windows 輸入法詳解Windows
- ubuntu新增中文輸入法Ubuntu
- ElementaryOS的輸入法配置
- noip模擬8[星際旅行·砍樹·超級樹·求和]
- 【Lintcode】1415. Residual Product
- 解決同時安裝搜狗輸入法和谷歌輸入法後fcitx無法使用谷歌
- win10增加輸入法的方法_win10輸入法如何新增Win10
- Win10輸入法設定方法_win 10 輸入法如何設定Win10
- 前端坑多:使用js模擬按鍵輸入的踩坑記錄前端JS
- selenium模擬登入12306
- Python-模擬登入Python
- 資料結構之樹( 線段樹,字典樹)資料結構
- 從一次輸入框無法輸入的bug,談如何限制輸入框輸入型別型別
- win10輸入法設定預設搜狗輸入法怎麼操作 w10怎麼把輸入法預設搜狗Win10
- 雙拼輸入法,助你神速輸出中文
- win10輸入法裡有個百度輸入法如何刪除Win10
- win10系統下中文輸入法無法輸入中文如何解決Win10