求问一下 poj3167 奶牛pattern 我的代码出错在哪 试了很多数据还是wa
#include
#include
#include
#include
using namespace std;
const int N=1000010,K=30000;
int n,k,s,h,ans;
int s1[N],s2[K],s3[N][30],s4[K][30],a[N];
int nxt[K];
bool fun(int a,int b) //判断文本串和模式串是否匹配
{
int t1=0,t2=0,t3=0,t4=0;
for(int i=1;i<=s;i++)
{
if(i>=s1[a]) break;
t1+=(s3[a][i]-s3[a-b][i]);//t1 文本串中第a个位置为终点,长度为 b的子串内比s1[a]小的个数。
}
t2=(s3[a][s1[a]]-s3[a-b][s1[a]]);//t2 文本串中第a个位置为终点,长度为 b的子串内和s1[a]相等的个数。
for(int i=1;i<=h;i++)
{
if(i>=s2[b]) break;
t3+=s4[b][i];//t3 模板串中前b个位置内比s2[b]小的个数。
}
t4=s4[b][s2[b]];//t4 模板串中前b个位置内和s2[b]相等的个数。
if(t1==t3&&t2==t4) return true;
else return false;
}
bool ffun(int a,int b) //构造next数组
{
int t1=0,t2=0,t3=0,t4=0;
for(int i=1;i<=h;i++)
{
if(i>=s2[a]) break;
t1+=(s4[a][i]-s4[a-b][i]);
}
t2=s4[a][s2[a]]-s4[a-b][s2[a]];
for(int i=1;i<=h;i++)
{
if(i>=s2[b]) break;
t3+=s4[b][i];
}
t4=s4[b][s2[b]];
if(t1==t2&&t3==t4) return true;
else return false;
}
int main(void)
{
scanf("%d%d%d",&n,&k,&s);
for(int i=1;i<=n;i++)
{
scanf("%d",&s1[i]);
s3[i][s1[i]]++;
}
for(int i=1;i<=k;i++)
{
scanf("%d",&s2[i]);
h=max(s2[i],h);//求一下模板串中的最大值
s4[i][s2[i]]++;
}
for(int i=2;i<=n;i++)
{
for(int j=1;j<=s;j++)
{
s3[i][j]+=s3[i-1][j];//处理前缀和
}
}
for(int i=2;i<=k;i++)
{
for(int j=1;j<=h;j++)
{
s4[i][j]+=s4[i-1][j];//处理前缀和
}
}
for(int i=2,j=0;i<=k;i++)
{
while(j&&!ffun(i,j+1)) j=nxt[j];
if(j==0||ffun(i,j+1)) j++;//j==0 成立 因为第一个数必定匹配
nxt[i]=j;
}
for(int i=1,j=0;i<=n;i++)
{
while(j&&!fun(i,j+1)) j=nxt[j];
if(j==0||fun(i,j+1)) j++;
if(j==k)
{
a[ans++]=i-k+1;
j=nxt[j];
}
}
cout<0;i0;
}
https://blog.csdn.net/m0_66603329/article/details/126353795
可以看一下
内存,时间是否有问题?