大致题意:
“abracadabra” > “aabracadabr” > “raabracadab” > “braabracada” > “abraabracad” > “dabraabraca” > “adabraabrac” > “cadabraabra” > “acadabraabr” > “racadabraab”。
大致思路:
把第一个字符串复制一份接在自己后面,并将其作为文本串,把第二个字符串作为模式串,做一遍KMP求出模式串在文本串中出现的位置即可。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=250005;
const int mMax=2000005;
char text[mMax],pat[nMax];
int lent,lenp,nnext[nMax];
void get_nnext(){
int i,j=-1;
nnext[0]=-1;
for(i=1;i<=lenp;i++){ //pat[j]是ä¸æ˜¯å¯ä»¥ç†è§£ä¸ºiçš„å‰ä¸€ä¸ªå—符的nnext值所指想的å—符
while(j>-1&&pat[j+1]!=pat[i])j=nnext[j];
if(pat[j+1]==pat[i])j++;
nnext[i]=j;
}
}
int KMP(){
int ans=0,i=0,j=-1;
get_nnext();
for(i=0;i<lent;i++){
while(j!=-1&&pat[j+1]!=text[i]){
j=nnext[j];
}
if(pat[j+1]==text[i])j=j+1;
if(j==lenp-1){
// cout<<"fuck "<<i<<endl;
if(i==lenp-1)return 0;
return lent-i-1;//ans++; //找到一个匹é…
}
}
return -1;
}
int main(){
int t;
while(scanf("%d",&lenp)!=EOF){
scanf("%s%s",text,pat);
for(int i=0;i<lenp;i++){
text[i+lenp]=text[i];
}
lent=2*lenp;
text[lent]='\0';
int ans=KMP();
if(ans!=-1){
printf("%d\n",ans);
}
else{
printf("-1\n");
}
}
return 0;
}
分享到:
相关推荐
**KMP算法详解** KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D.E. Knuth、V.R. Morris和J.H. Pratt于1977年提出。它解决了在一个主串(文本串)中查找一个模式串(目标串)的问题,避免了在匹配...
void KMP(std::string s, std::string p) { std::vector<int> lps = computeLPS(p); int m = s.size(), n = p.size(); int i = 0, j = 0; while (i ) { if (s[i] == p[j]) { i++; j++; } else { if (j > 0)...
void replaceString(std::string& str, const std::string& from, const std::string& to) { size_t pos = 0; while ((pos = str.find(from, pos)) != std::string::npos) { str.replace(pos, from.length(), to)...
bool kmpSearch(const std::string& text, const std::string& pattern, int* partialMatchTable) { int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j]) { i++; j++; } else if (j > 0) { ...
void KMP(const std::string& text, const std::string& pattern) { int n = text.size(), m = pattern.size(); const auto& pi = computePrefixFunction(pattern); int i = 0, j = 0; while (i ) { if (text[i...
最后,为了方便与其他类型的对象进行转换,我们可以提供`toStdString()`(返回std::string)和`fromStdString(const std::string&)`(从std::string创建String)函数: ```cpp std::string toStdString() const { ...
例如,如果我们有主字符串`str = "111aaa222bbbccc"`,我们可以使用`str.find("111")`来查找子字符串"111",如果找到则返回其在主字符串中的起始位置,否则返回`std::string::npos`。 接下来,我们涉及到了逻辑运算...
kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...
1. **字符串数据存储**:可能使用C++的`std::string`,或者自定义字符数组来存储字符串数据。 2. **部分匹配表计算**:一个成员函数,如`buildPrefixFunction()`,用于计算模式串的前缀函数。 3. **KMP匹配**:一个...
int COUNT_KMP(const std::string &S, const std::string &T) { std::vector<int> next(T.size()); NEXT(T, next); int index = 0, count = 0; while (index ()) { int pos = 0; while (pos () && index ()) {...
bool KMP(const std::string& text, const std::string& pattern) { std::vector<int> prefix(pattern.size()); computePrefixFunction(prefix, pattern); int i = 0, j = 0; while (i () && j ()) { if (text...
D-KMP体系结构-官方样本这是D-KMP架构的官方示例,展示了一个适用于Android和iOS的简单主/详细应用程序。 有关D-KMP体系结构的更多信息,请阅读相关的。D-KMP体系结构的主要功能: 它使用最新的声明性UI工具包:适用...
kmp算法内容概况: 本文将介绍一种名为KMP的字符串匹配算法。KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,由Donald Knuth、Vaughan Pratt和James H. Morris共同发明。KMP算法通过使用一个称为...
void KMP(const std::string &text, const std::string &pattern) { std::vector<int> lps = computeLPS(pattern); int index = 0, textIndex = 0; while (textIndex ()) { if (pattern[index] == text[text...
void kmpMatch(const std::string& text, const std::string& pattern, std::vector<int>& result) { // 计算部分匹配表 int* lps = computeLPS(pattern); int i = 0, j = 0; while (i ()) { if (pattern[j] ...
int KMP(const std::string& text, const std::string& pattern) { std::vector<int> lps(pattern.size()); computeLPS(lps, pattern); int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j])...
bool KMPMatch(const std::string &text, const std::string &pattern) { // ... 使用部分匹配表进行字符串匹配 } int main() { std::string text = "abcdefgahijk"; // 主串 std::string pattern = "abcgah"; /...
《KMP-Expander:CSV格式的Mario Kart 7赛道编辑工具详解》 在电子游戏领域,特别是赛车游戏,Mario Kart 7凭借其丰富的赛道设计和竞技性深受玩家喜爱。为了满足玩家对自定义赛道的需求,开发人员和爱好者们创造了...
text: String, partial_match_table: Vec, } impl KMP { fn build_table(pattern: &str) -> Vec<usize> { // ... 构建部分匹配表的逻辑 ... } fn match_pattern(&self, text: &str) -> Vec<usize> { // ......
void KMPMatch(const std::string &text, const std::string &pattern) { int prefixTable[pattern.size()]; computePrefixTable(pattern, prefixTable); for (int i = 0, j = 0; i (); ++i) { while (j > 0 &&...