計算next陣列的方法是對於長度為n的匹配串,從0到n-1位依次求出字首字尾最大匹配長度。
下面的寫法是僅僅檢測有沒有匹配然後返回第乙個匹配位置,而不是返回所有匹配位置。
#include #include#include
using
namespace
std;
const
int n=100
;char str[100],ptr[100];//
父串str和子串ptr
int next[100
];string
ans;
void getnext()//
獲取next陣列
}int kmp(char *a,char *b)//
匹配ab兩串,a為父串
else j=next[j+1];//
到前乙個匹配點
}
if(j>=len2)
return i-j;
else
return -1;}
intmain()
return0;
}
字典樹 - 一對多
其實trie也叫做字首樹。
基本性質
1,根節點不包含字元,除根節點意外每個節點只包含乙個字元。
2,從根節點到某乙個節點,路徑上經過的字元連線起來,為該節點對應的字串。
3,每個節點的所有子節點包含的字串不相同。
優點:
可以最大限度地減少無謂的字串比較,故可以用於詞頻統計和大量字串排序。
跟雜湊表比較:
1,最壞情況時間複雜度比hash表好
2,沒有衝突,除非乙個key對應多個值(除key外的其他資訊)
3,自帶排序功能(類似radix sort),先序遍歷trie可以得到排序。
可以用來得到字串最長公共字首**成lca問題/最近公共祖先問題,用tarjan演算法,dfs某個節點的子樹,子樹之間的相互的最近公共祖先就是這個節點)
#include#include#include
#include
#include
#include
#include
using
namespace
std;
/*trie字典樹
*/struct
tnode
};tnode *root;
tnode*newnode()
//插入函式
void insert(char *s)
p = p->next[x];
}p->sum++;//
這個單詞終止啦}//
匹配函式
bool compare(char *ch)
}return
false;}
void delete(tnode * &top)
intmain()
cin>>m;
for(int i =0;i)
delete(root);
//看見指標就要想到釋放,然而這東西會花時間,所以網上很多人寫acm題就不delete了,我很看不慣這一點。
return0;
}
ac自動機
#include #include#include
#include
#include
using
namespace
std;
struct
trie
void
init()
void insert(char s,int
id)
end[now]=id;
}void
build()
}while(!q.empty())}}
}bool used[510
];
bool query(char buf,int n,int
id)
temp =fail[temp];}}
if(!flag)
return
false
; printf(
"web %d:
",id);
for(int i = 1; i <= n; i++)
if(used[i])
printf("%d
",i);
printf("\n
");return
true
; }
};char buf[10010
];trie ac;
intmain()
ac.build();
int ans = 0
; scanf("%d
",&m);
for(int i = 1; i <= m; i++)
printf(
"total: %d\n
",ans);
}return0;
}
模板 kmp字串匹配
題目 kmp字串匹配 資料 syc大佬的部落格 思路 nxt i 字串0 i的最長相等的字首字尾長減1,也就是最長相等字首字尾中的字首的結束位置。比如從i開始查詢到j處時不匹配,nxt j 2,也就是說a段和b段完全相等,因為a是x串的字首,那麼b也是x串的字首,可以直接從b段開始匹配 i j xx...
模板 KMP字串匹配
顧名思義,就是一種用來進行字串匹配的演算法。這種演算法的核心就是乙個nxt陣列,表示在模式串的第i位失配後,應該跳到模式串的哪一位繼續匹配。為什麼要這樣?顯然,因為文字串是不確定的,所以在匹配的時候的nxt陣列肯定是按照模式串建的。其次,為什麼要設乙個nxt陣列呢?模 式串 abc ab c模式串 ...
模板 KMP字串匹配
題目鏈結 給出兩個字串 s1 和 s2,若 s1 的區間 l,r 子串與 s2 完全相同,則稱 s2 在 s1 現了,其出現位置為 l。現在請你求出 s2 在 s1 中所有出現的位置。定義乙個字串 s 的 border 為 s 的乙個非 s 本身的子串 t,滿足 t 既是 s 的字首,又是 s 的字...