为什么用3目运算就是错的
查看原帖
为什么用3目运算就是错的
357785
qq1464939887楼主2020/11/25 00:23
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> next;
int GetOfIndex(string& s1,string& s2,int start)
{
	int cur1=start;
	int cur2=0;
	while(cur1<s1.size()&&cur2<s2.size())
	{
		if(s1[cur1]==s2[cur2]){
			cur1++;cur2++;
		}
		else if(next[cur2]==-1)cur1++;
		else cur2=next[cur2];
	}
	return cur2==s2.size()?cur1-cur2:-1;
}
void KMP(string& s1,string& s2)
{
	next.resize(s2.size());
	next[0]=-1;next[1]=0;
	int cn=0;int cur=2;
	while(cur<s2.size())
	{
		if(s2[cur-1]==s2[cn])next[cur++]=++cn;
		else if(cn>0)cn=next[cn];
		else next[cur++]=0;
	}
	int sign=0;
	int start=0;
	while(1)
	{
		sign=GetOfIndex(s1,s2,start);
		if(sign==-1)break;
		s1.erase(sign,s2.size());
		start=sign-s2.size()>=0?sign-s2.size():0;
	}
}
int main( )
{
	string str1;
	string str2;
	cin>>str1>>str2;
	KMP(str1,str2);
	cout<<str1;
 } 
#include<iostream>
#include<string>
#include<vector>
using namespace std;
vector<int> next;
int GetOfIndex(string& s1,string& s2,int start)
{
	int cur1=start;
	int cur2=0;
	while(cur1<s1.size()&&cur2<s2.size())
	{
		if(s1[cur1]==s2[cur2]){
			cur1++;cur2++;
		}
		else if(next[cur2]==-1)cur1++;
		else cur2=next[cur2];
	}
	return cur2==s2.size()?cur1-cur2:-1;
}
void KMP(string& s1,string& s2)
{
	next.resize(s2.size());
	next[0]=-1;next[1]=0;
	int cn=0;int cur=2;
	while(cur<s2.size())
	{
		if(s2[cur-1]==s2[cn])next[cur++]=++cn;
		else if(cn>0)cn=next[cn];
		else next[cur++]=0;
	}
	int sign=0;
	int start=0;
	while(1)
	{
		sign=GetOfIndex(s1,s2,start);
		if(sign==-1)break;
		s1.erase(sign,s2.size());
		start=sign-s2.size()-1;
		if(start<0)start=0;
	}
}
int main( )
{
	string str1;
	string str2;
	cin>>str1>>str2;
	KMP(str1,str2);
	cout<<str1;
 } 

89行的地方 第一个用的三目运算WA,第二个用if就AC了?????要不是我瞎改了下,还真找不到这个地方的错误??

2020/11/25 00:23
加载中...