Material auxiliar da disciplina Tópicos Especiais em Algoritmos do curso superior de Ciência da Computação do IFB-Taguatinga.
© 2021. All rights reserved.
Slides de strings.
#include <bits/stdc++.h> using namespace std; bool compare(string& t,string& p,size_t i){ return p == t.substr(i,p.size()); } int preprocess(string& s,int d,int q){ int sum = 0; for(size_t i=0;i<s.size();i++){ sum = (sum*d + s[i]) % q; } return sum; } void rabin_karp(string& t,string& p,int d, int q){ int h = pow(d,p.size()-1); h = h % q; int p_v = preprocess(p,d,q); auto t_prefix = t.substr(0,p.size()); int t_v = preprocess(t_prefix,d,q); for(size_t i=0;i<t.size()-p.size()+1;i++){ if(p_v == t_v && compare(t,p,i)){ cout << "Padrão ocorre na posição " << i << endl; } if(i<t.size()-p.size()){ t_v = ((( d*(t_v- t[i]*h) + t[i+p.size()]) % q)+q) % q; } } } int main(){ string t = "2359023141526739921"; string p = "31415"; for(size_t i=0;i<t.size();i++){ t[i] -='0';} for(size_t i=0;i<p.size();i++){ p[i] -= '0';} rabin_karp(t,p,10,13); }
#include <bits/stdc++.h> using namespace std; vector<int> preprocess(string& p){ vector<int> next(p.size()+1); int j; next[0] = j = -1; for(size_t i=1;i<=p.size();i++){ while(j>=0 && p[i-1]!=p[j]){ j = next[j]; } j++; next[i] = j; } return next; } void kmp(string& t,string& p){ auto next = preprocess(p); size_t i,j; i = j = 0; while(i<t.size()){ while(j>=0 && p[j]!=t[i]){ j = next[j]; } j++; i++; if(j==p.size()){ cout << "Padrão encontrado na posição " << i-j << endl; j = next[j]; } } } int main(){ string t = "xyxxyxyxyyxyxyxyyxyxyxx"; string p = "xyxyyxyxyxx"; kmp(t,p); }