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

题目

8783:单词接龙

爆搜可枚举序列⭐⭐⭐

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

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

#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也是个容器呀)等的时候出现的

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值