• HDU 1711 Number Sequence(算法验证)


    该怎么做、每一个人的人生都应该自己掌握、你给不了别人一切、你也不懂别人的忧伤、

                                                                                              微笑不代表快乐、哭泣不一定悲伤

                   不努力怎么让关心你的人幸福、不努力怎么让看不起你的人绝望、

                                                                                                                                        

                                                                                                                                                                  我用生命在奋斗——lx_Zz

    —————————————————————————————————————————————————————————————

    —————————————————————————    华丽的切割线    ————————————————————————————

    —————————————————————————————————————————————————————————————

    10678686 2014-05-05 03:11:35 Accepted 1711 468MS 4224K 1865 B C++

    经过验证、发现我刚刚YY的算法目測是正确的、、O(∩_∩)O哈哈~效果还不错。。

    。→_→

    淡淡改了一下、毕竟都是类似的题、废话不多说、直接上代码:

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    
    int str1[10005];
    int str2[1000005];
    int next[10005];
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n,m;
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++)
                scanf("%d",&str2[i]);
            for(int i=0;i<m;i++)
                scanf("%d",&str1[i]);
            int len1=m;
            next[0]=-1;
            for(int i=1;i<len1;i++)
            {
                if(str1[i]==str1[next[i-1]])
                {
                    next[i]=next[i-1]+1;
                }
                else if(str1[i]==str1[0])
                {
                    next[i]=1;
                }
                else next[i]=0;
            }
            int len2=n;
            int ans=-1;
            int flag=0;
            for(int i=0,j=0;i<len2;)
            {
                int ff=0;
                if(str1[j]==str2[i])
                {
                    i++;j++;
                    if(j>=len1)
                    {
                        ans=i-m+1;
                        break;
                    }
                }
                else
                {
                    while(str1[j]!=str2[i])
                    {
                        if(j==0)
                        {
                            ff=1;
                            break;
                        }
                        j=next[j-1];
                        if(j==-1)
                        {
                            ff=1;
                            break;
                        }
                    }
                    if(ff)
                    {
                        if(str1[0]==str2[i])
                        {
                            i++;j=1;
                        }
                        else
                        {
                            i++;j=0;
                        }
                    }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Aspose.Total 最全的一套office文档管理方案
    C# 利用Aspose.Slides.dll将本地ppt文档转化成pdf(完美破解版 无水印 无中文乱码)
    C# 利用Aspose.Cells .dll将本地excel文档转化成pdf(完美破解版 无水印 无中文乱码)
    C# 利用Aspose.Words .dll将本地word文档转化成pdf(完美破解版 无水印 无中文乱码)
    利用记事本和cmd进行java编程(从安装IDE--编译--运行)
    web-天下武功唯快不破
    代码审计-extract变量覆盖
    代码审计-strpos数组绕过
    代码审计-ereg正则%00截断
    nginx平滑升级实战
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4639238.html
Copyright © 2020-2023  润新知