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
  • 相关阅读:
    Unity 3(一):简介与示例
    MongoDB以Windows Service运行
    动态SQL中变量赋值
    网站发布IIS后堆栈追踪无法获取出错的行号
    GridView Postback后出错Operation is not valid due to the current state of the object.
    Visual Studio 2010 SP1 在线安装后,找到缓存在本地的临时文件以便下次离线安装
    SQL Server 问题之 排序规则(collation)冲突
    IIS 问题集锦
    linux下安装mysql(ubuntu0.16.04.1)
    apt-get update 系列作用
  • 原文地址:https://www.cnblogs.com/TYH-TYH/p/9382988.html
Copyright © 2011-2022 走看看