zoukankan      html  css  js  c++  java
  • CF126B password&&HDU 4763 Theme Section

    http://acm.hdu.edu.cn/showproblem.php?pid=4763

    http://codeforces.com/problemset/problem/126/B

    这两个题都是在考察next的应用。区别在于一个是不能有重叠,一个是可以有重叠。

    一级条件,前后缀都存在;二级条件 在之前存在前后缀。

    对于可以重叠的,很简单,利用next记录一下前缀后缀都存在的那些点,然后跑一遍循环找一下这些满足一级条件的哪些满足二级条件,就ok了。

    不可以重叠的,其实就是加了一个零级条件,判断长度,还有一个四级条件,还是长度。

    还是有收获的。

    对于next理解又多了一点,标注next其实就是标注这个位置之前是否满足前后缀一样。满足就美滋滋了。

    贴代码,具体体会一下

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <string.h>
     4 #include <string> 
     5 #include <map>
     6 #include <queue>
     7 #include <deque>
     8 #include <vector>
     9 #include <set>
    10 #include <algorithm>
    11 #include <math.h>
    12 #include <cmath>
    13 #include <stack>
    14 #include <iomanip>
    15 #define mem0(s1) memset(s1,0,sizeof(s1))
    16 #define meminf(s1) memset(s1,0x3f,sizeof(s1))
    17 #define ll long long
    18 using namespace std;
    19 int nex[1000005],l1,l2;
    20 void getn(int n,char c[])
    21 {
    22     int i=0,j=-1;
    23     nex[0]=-1;
    24     while(i<n)
    25     {
    26         if(j==-1||c[i]==c[j])
    27         {
    28             i++;j++;nex[i]=j;
    29         }
    30         else j=nex[j];
    31     }
    32     return;
    33 }
    34 int f[1000005];
    35 int main()
    36 {
    37     int t;
    38     cin>>t;
    39     char s[1000005];
    40     while(t--)
    41     {
    42         scanf("%s",s);
    43         int l=strlen(s);
    44         getn(l,s);
    45         mem0(f);
    46         int tmp=l;
    47         while(tmp>0)
    48         {
    49             if(l>=2*tmp) f[tmp]=1;
    50             tmp=nex[tmp];
    51         }
    52         int ans=0;
    53         for(int i=l-1;i>1;i--)
    54         {
    55             tmp=i;
    56             while(tmp>0){
    57             if(f[tmp]&&i>=2*tmp&&l>=tmp+i)
    58             {
    59                 ans=max(ans,tmp);break;
    60             }
    61             tmp=nex[tmp];
    62             }
    63         }
    64         cout<<ans<<endl;
    65     }
    66 }
    View Code
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define mem0(a) memset(a,0,sizeof a)
     4 #define ll long long
     5 int nxt[1000006],vis[1000005];
     6 inline void getn(int len,char s[])
     7 {
     8     int i,j;
     9     nxt[0]=-1;
    10     for (i=0;i<len;++i)
    11      {
    12          j=nxt[i];
    13          while (j!=-1&&s[j]!=s[i]) j=nxt[j];
    14          nxt[i+1]=j+1;
    15      }
    16     return;
    17 }
    18 int main()
    19 {
    20     char s[1000005];
    21     while(~scanf("%s",s))
    22     {
    23         int l=strlen(s);int ans=0;
    24         int flag=0;
    25         getn(l,s);
    26         int maxx=nxt[l];
    27         mem0(vis);
    28         vis[maxx]=1;
    29         if(maxx==0) puts("Just a legend
    ");
    30         else 
    31         {
    32             while(maxx>0){
    33             vis[maxx]=1;
    34             maxx=nxt[maxx];
    35         }
    36           for(int i=2;i<l;++i)
    37           {
    38               if(vis[nxt[i]]&&nxt[i]>ans) 
    39                ans=nxt[i],flag=1;
    40           }
    41           if(!flag) puts("Just a legend
    ");
    42           else printf("%s
    ",s+l-ans);
    43         }
    44     }
    45     return 0;
    46 }
    View Code
  • 相关阅读:
    js 比较日期的大小
    日历(从今天起后面的14天)
    数字转大写
    object对象进行深拷贝
    浏览器渲染机制
    t-5.倒计时(秒杀效果)--本地--服务器(待续)
    s-1.rem自适应
    t-3.跑马灯
    t-2.手机端简单轮播(无滑动效果)
    16.弹性布局
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9382988.html
Copyright © 2011-2022 走看看