非txt文本文档读写处理模板代码
#include<bits/stdc++.h>
using namespace std;
int next[1000001];//用来标记的next数组
int len1,len2;
char string1[1000001],string2[1000001];//默认病毒的最大长度为1000000
void kmp(int len1,int len2)
{
int i=0,j=0;
while(i<len1&&j<len2)
{
if(j==-1||string1[i]==string2[j])
{
i++;j++;
}
else
j=next[j];//如果失失配 j跳到next数组标记的位置
}
if(j>=len2)
printf("YES\n");
else
printf("NO\n");
}
void getnext(int len)
{
int i=0;next[0]=-1;int j=-1;//next的初始处理
while(i<len)//判断字符串是否处理完成
{
if(j==-1||string2[i]==string2[j])
{
i++;j++;//标记后移
if(string2[i]==string2[j])//这里运用了改良版的kmp算法 处理异常情况速度更快
{
next[i]=next[j];
}
else
next[i]=j;
}
else
j=next[j];
}
}
int main()
{
while(~scanf("%s%s",string1,string2))//可连续读入字符串 注意两个字符串之间需要换行符进行分开
{
len1=strlen(string1);//求出两个字符串的长度
len2=strlen(string2);
getnext(len2-1);//对子串 即匹配串进行预处理 得到对应的next数组
kmp(len1,len2);//子串和母串进行匹配
}
}