“terminate called after throwing an instance of ‘std::out_of_range‘“

单词接龙(组成一个序列连接起来)

    • 题目
    • 爆搜可枚举序列⭐⭐⭐
    • 按顺序连接若干单词(删去重叠部分)
    • 一个访问越界error

题目

8783:单词接龙

爆搜可枚举序列⭐⭐⭐

无论是 还原文件还是单词接龙,在想要求某个组合时,因为不明白 文件碎片/单词 的排列顺序,需要深搜枚举序列
尤其这题,每个单词可用两遍,更是直指搜索
因为爆搜可以抉择每个单词用几遍

按顺序连接若干单词(删去重叠部分)

#include  
#include  
#include  
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<
//		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

一个访问越界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也是个容器呀)等的时候出现的

你可能感兴趣的:(搜索,c++,开发语言)