您的位置:首页 > 其它

hdu 1711为何WA这么多次

2015-02-02 16:04 169 查看
WA的代码:

#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
const int maxnum=10010;
using namespace std;
int mother[1000010];
int son[maxnum];
int next[maxnum];
int chang1,chang2;
void build()
{
    int i,j=0;
    next[1]=0;
    for(i=2;i<=chang2;i++)
    {
        while(j>0&&son[j+1]!=son[i])
            j=next[j];
        if(son[j+1]==son[i])
            j++;
        next[i]=j;
    }
}
int kmp()
{
    int i=1,j=1;
    while(i<=chang1&&j<=chang2)
    {
        if(mother[i]==son[j]||j==0)
        {
            i++;
            j++;
         if(j==chang2+1)
            return i-j+1;
        }
        else
         j=next[j];
    }
        return -1;
}
int main()
{
    int casenumber;
    scanf("%d",&casenumber);
    while(casenumber--)
    {

        scanf("%d%d",&chang1,&chang2);
        int i;
        for(i=1;i<=chang1;i++)
            scanf("%d",&mother[i]);
        for(i=1;i<=chang2;i++)
            scanf("%d",&son[i]);
        if(chang2>chang1)
           printf("-1\n");
        else
        {
               memset(next,0,sizeof(next));
               build();
               for(i=1;i<=chang2;i++)
                cout<<next[i]<<" ";
               int ans=kmp();
        printf("%d\n",ans);
        }

    }
    return 0;
}


AC的代码

#include <iostream>
#include<stdio.h>
#include<string>
#include<string.h>
const int maxnum=10010;
using namespace std;
int mother[1000010];
int son[maxnum];
int next[maxnum];
int chang1,chang2;
void build()
{
    int i,j=0;
    next[1]=0;
    i=1;j=0;
    while(i<chang2)
    {
        if(j==0||son[i]==son[j])
        {
            i++;
            j++;
            if(son[i]!=son[j])
                next[i]=j;
            else
                next[i]=next[j];
        }
        else
            j=next[j];
    }
}
int kmp()
{
    int i=1,j=1;
    while(i<=chang1&&j<=chang2)
    {
        if(mother[i]==son[j]||j==0)
        {
            i++;
            j++;
         if(j==chang2+1)
            return i-j+1;
        }
        else
         j=next[j];
    }
        return -1;
}
int main()
{
    int casenumber;
    scanf("%d",&casenumber);
    while(casenumber--)
    {

        scanf("%d%d",&chang1,&chang2);
        int i;
        for(i=1;i<=chang1;i++)
            scanf("%d",&mother[i]);
        for(i=1;i<=chang2;i++)
            scanf("%d",&son[i]);
        if(chang2>chang1)
           printf("-1\n");
        else
        {
               memset(next,0,sizeof(next));
               build();
               //for(i=1;i<=chang2;i++)
                // cout<<next[i]<<" ";
               int ans=kmp();
        printf("%d\n",ans);
        }

    }
    return 0;
}
问题主要是出在求next值上,想不通到底是为什么会造成这些差异
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: