单词接龙(组成一个序列连接起来)
题目
爆搜可枚举序列⭐⭐⭐
无论是 还原文件还是单词接龙,在想要求某个组合时,因为不明白 文件碎片/单词 的排列顺序,需要深搜枚举序列
尤其这题,每个单词可用两遍,更是直指搜索
因为爆搜可以抉择每个单词用几遍
按顺序连接若干单词(删去重叠部分)
#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
using namespace std;
const int N=55;
int next[N];
void getnext(string p){
int len=p.size();
int i=0;
int j=-1;
next[0]=-1;
while(i<len){
if(j==-1||p[i]==p[j]){
i++,j++;
next[i]=j;
}
else j=next[j];
}
}
int kmp(string t,string p,int st){
int lt=t.size();
int lp=p.size();
int i=st;
int j=0;
while(i<lt){
if(j==-1||t[i]==p[j]){
i++,j++;
}
else j=next[j];
// if(j==lp){//算是abcdefg efg,所以返回得j是lp
// cout<<i-lp+1<<endl;
// j=next[j];//回溯到p【0】
// }
//否则,abcdefg fghijk ,返回得j是2(g对应得下标+1)
}
return j;
}
signed main(){
// ios::sync_with_stdio(false);
// cin.tie(0);
int n;
cin>>n;
string str="";
string t="";
getline(cin,str);
cin>>t;
for(int i=1;i<n;i++){
cin>>str;
getnext(str);
int len=str.size();
// int st=max(0,(t.size())-len);
int st=t.size()-len;
st=max(st,0);
int pos=kmp(t,str,st);
cout<<pos<<endl;
t+=str.substr(pos,len-pos+1);
cout<<t<<endl;
}
cout<<t.size();
return 0;
}
笑死,看到题目不知道干了啥
自己臆想了一个题目属于是
最难理解得是kmp中返回得j,j指向得是模式串与主串中不匹配得第一个字符
如若一个都不匹配,最后返回得就是下标0(从-1加过来得)
写的时候,return t 放在了 while(i<lt) 循环里面,直接返回-1,导致,string的substr函数,str.substr(pos,len)导致报下面访问越界的错误
一个访问越界error
C++如果遇到:
-
1.“terminate called after throwing an instance of ‘std::out_of_range’”
-
2.“Abort message: 'terminating with uncaught exception of type std::out_of_range”
这样的错误,极有可能是访问越界的问题。
导致越界的原因:
通常情况是在使用c++的容器的时候出现的问题,如在使用vector、map、还有string(差点忘记string也是个容器呀)等的时候出现的