\section{Strings} \begin{algorithm}{\textsc{Knuth-Morris-Pratt}-Algorithmus} \begin{methods} \method{kmpSearch}{sucht \code{sub} in \code{s}}{\abs{s}+\abs{sub}} \end{methods} \sourcecode{string/kmp.cpp} \end{algorithm} \begin{algorithm}{Z-Algorithmus} \begin{methods}[ll] $z_i\coloneqq$ Längstes gemeinsames Präfix von $s_0\cdots s_{n-1}$ und $s_i\cdots s_{n-1}$ & \runtime{n} \end{methods} Suchen: Z-Algorithmus auf \code{P\$S} ausführen, Positionen mit $z_i=\abs{P}$ zurückgeben \sourcecode{string/z.cpp} \end{algorithm} \begin{algorithm}{Rolling Hash} \sourcecode{string/rollingHash.cpp} \end{algorithm} \begin{algorithm}{Pattern Matching mit Wildcards} Gegeben zwei strings $A$ und $B$,$B$ enthält $k$ \emph{wildcards} enthält. Sei: \begin{align*} a_i&=\cos(\alpha_i) + i\sin(\alpha_i) &\text{ mit } \alpha_i&=\frac{2\pi A[i]}{\Sigma}\\ b_i&=\cos(\beta_i) + i\sin(\beta_i) &\text{ mit } \beta_i&=\begin{cases*} \frac{2\pi B[\abs{B}-i-1]}{\Sigma} & falls $B[\abs{B}-i-1]\in\Sigma$ \\ 0 & sonst \end{cases*} \end{align*} $B$ matcht $A$ an stelle $i$ wenn $(b\cdot a)[|B|-1+i]=|B|-k$. Benutze FFT um $(b\cdot a)$ zu berechnen. \end{algorithm} \begin{algorithm}{\textsc{Manacher}'s Algorithm, Longest Palindrome} \begin{methods} \method{init}{transformiert \code{string a}}{n} \method{manacher}{berechnet Längen der Palindrome in longest}{n} \end{methods} \sourcecode{string/manacher.cpp} \end{algorithm} \begin{algorithm}{Longest Common Subsequence} \begin{methods} \method{lcss}{findet längste gemeinsame Sequenz}{\abs{a}\*\abs{b}} \end{methods} \sourcecode{string/longestCommonSubsequence.cpp} \end{algorithm} \columnbreak \begin{algorithm}{\textsc{Aho-Corasick}-Automat} \begin{methods}[ll] sucht patterns im Text & \runtime{\abs{Text}+\sum\abs{pattern}} \end{methods} \begin{enumerate} \item mit \code{addString(pattern, idx)} Patterns hinzufügen. \item rufe \code{buildGraph()} auf \item mit \code{state = go(state, idx)} in nächsten Zustand wechseln. \item erhöhe dabei \code{dp[state]++} \item rufe \code{dfs()} auf. In dp[pattern state] stehen die Anzahl der Matches \end{enumerate} \sourcecode{string/ahoCorasick.cpp} \end{algorithm} \clearpage \begin{algorithm}{\textsc{Lyndon} und \textsc{De-Bruijn}} \begin{itemize} \item \textbf{\textsc{Lyndon}-Wort:} Ein Wort das lexikographisch kleiner ist als jede seiner Rotationen. \item Jedes Wort kann \emph{eindeutig} in eine nicht ansteigende Folge von \textsc{Lyndon}-Worten zerlegt werden. \item Für \textsc{Lyndon}-Worte $u, v$ mit $u