HDU 1671 字典樹(判斷是否有一個串是另一個串的子串)。
給你多個由0-9構成的字串集合,問你這個集合中是否有一個字串是其他字串的字首?
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxnode=100000+1000;
const int sigma_size=10;
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];//非單詞節點為0,單詞節點為1
int sz;
void init()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof(ch[0]));
}
bool insert(char *s)
{
bool ok=true;
int n=strlen(s),u=0;
for(int i=0;i<n;i++)
{
int id=s[i]-'0';
if(ch[u][id]==0)
{
ch[u][id]=sz;
val[sz]=0;
memset(ch[sz],0,sizeof(ch[sz]));
sz++;
}
u=ch[u][id];
if(val[u]>0)//存在當前插入串s的字首
ok=false;
}
val[u]=1;
if(ok)
{
for(int i=0;i<sigma_size;i++)
if(ch[u][i]!=0)//存在包含當前插入串的長串
{
ok=false;
break;
}
}
return ok;
}
};
Trie trie;
char word[20];
int main()
{
int kase;
scanf("%d",&kase);
while(kase--)
{
int n;
scanf("%d",&n);
trie.init();
bool ok=true;
for(int i=0;i<n;i++)
{
scanf("%s",word);
if(ok)
ok=trie.insert(word);
}
if(ok)printf("YES\n");
else printf("NO\n");
}
return 0;
}
相關文章
- 30串聯所有單詞的子串
- 子串位置
- 最長子串
- 子串查詢
- 演算法問題——判斷陣列中是否含有某一字串演算法陣列字串
- [leetcode 30 串聯所有單詞的子串 10ms]LeetCode
- 最長上升子串
- 子串匹配 BF法
- 判斷迴文串 字串/數字相互轉換字串
- HDU 2197 本原串 (規律+快速冪)
- Python找回文子串的方法Python
- lCS(最長公共子串)
- 04.子串,啟動!
- 判斷一個有向圖是否有環
- LeetCode題解(1639):統計只差一個字元的子串數目(Python)LeetCode字元Python
- 【JavaScript使用技巧】三個擷取字串中的子串,你用的哪個JavaScript字串
- 如何判斷一個類是從另一個類繼承繼承
- Python連線兩個字串並去除首尾重複子串Python字串
- Python小技巧 - 子串查詢Python
- [NOIP2015 提高組] 子串
- 76. 最小覆蓋子串
- java 最長迴文子串Java
- LeetCode133:給定一個字串,找出最長的不具有重複字元的子串的長度。例如,“abcabcbb”不具有重複字元的最長子串是“abc”,長度為3。對於“bbbbb”,最長的不具有重複字元的子串是LeetCode字串字元
- 自己實現一個 DFA 串模式識別器(一)模式
- python如何判斷一個物件是否是列表Python物件
- 每日一算--最長迴文子串
- abc295D 統計由SS構成的子串個數
- 無重複字元的最長子串字元
- 判斷一個物件是否為空物件,判斷一個物件中是否有空值物件
- 線性dp:最長公共子串
- 雙子串最大異或 題解
- DreamJudge-1294-字尾子串排序排序
- 5. 最長迴文子串
- 【每日一題】無重複字元的最長子串每日一題字元
- 一串字串的翻轉字串
- 自己實現一個 DFA 串模式識別器(二)模式
- 洛谷 - P6292 區間本質不同子串個數(SAM+LCT+線段樹)
- Leetcode 3.無重複字元的最長子串 字典記錄每個字元最後出現的位置LeetCode字元