找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1404|回复: 0
打印 上一主题 下一主题
收起左侧

HDU1711 C++源码

[复制链接]
跳转到指定楼层
楼主
HDU1711工程包:


C++源程序如下:
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <vector>
  4. #include <cstring>
  5. #define MAX 1000100
  6. #define M 10010
  7. using namespace std;
  8. int a[MAX];
  9. int b[M];
  10. int NEXT[M];

  11. class Number_Sequence
  12. {
  13.     int p,len1,len2;
  14. public:
  15.     void initial();
  16.     void read();
  17.     void computing();
  18.     void result();
  19.     void getnext();
  20.     void kmp();
  21. };

  22. void Number_Sequence::initial()
  23. {
  24.     memset(a,0,sizeof(a));
  25.     memset(b,0,sizeof(b));
  26.     memset(NEXT,0,sizeof(NEXT));
  27.     p=-1;
  28. }

  29. void Number_Sequence::read()
  30. {
  31.     scanf("%d%d",&len1,&len2);
  32.     for(int i=0;i<len1;i++)
  33.     {
  34.         scanf("%d",&a[i]);
  35.     }
  36.     for(int i=0;i<len2;i++)
  37.     {
  38.         scanf("%d",&b[i]);
  39.     }
  40. }

  41. void Number_Sequence::getnext()
  42. {
  43.     NEXT[0]=-1;
  44.     int j=0,k=-1;
  45.     while(j<len2)
  46.     {
  47.         if(k==-1||b[j]==b[k])
  48.         {
  49.             if(b[++j]==b[++k])
  50.             {
  51.                 NEXT[j]=NEXT[k];
  52.             }
  53.             else
  54.                 NEXT[j]=k;
  55.         }
  56.         else
  57.             k=NEXT[k];
  58.     }
  59. }

  60. void Number_Sequence::kmp()
  61. {
  62.     int i=0,j=0;
  63.     while(i<len1&&j<len2)
  64.     {
  65.         if(j==-1||a[i]==b[j])
  66.         {
  67.             i++;
  68.             j++;
  69.         }
  70.         else
  71.         {
  72.             j=NEXT[j];
  73.         }
  74.         if(j==len2)
  75.         {
  76.             p=i-j+1;
  77.             break;
  78.         }
  79.     }
  80.     if(j!=len2)
  81.     {
  82.         p=-1;
  83.     }
  84. }

  85. void Number_Sequence::computing()
  86. {
  87.     getnext();
  88.     kmp();
  89. }

  90. void Number_Sequence::result()
  91. {
  92.     cout<<p<<endl;
  93. }

  94. int main()
  95. {
  96.     Number_Sequence ns;
  97.     int cases;
  98.     scanf("%d",&cases);
  99.     for(int i=0;i<cases;i++)
  100.     {
  101.         ns.initial();
  102.         ns.read();
  103.         ns.computing();
  104.         ns.result();
  105.     }
  106.     return 0;
  107. }
复制代码

所有资料51hei提供下载:
HDU 1711.rar (241.11 KB, 下载次数: 5)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表