zoukankan      html  css  js  c++  java
  • 洛谷$P5329 [SNOI2019]$字符串 字符串

    正解:字符串

    解题报告:

    传送门$QwQ$

    有两个很妙的方法,分别港下$QwQ$

    首先为了表示方便,这里和题面一样设$s_i$表示去掉第$i$个字母得到的字符串.另设$lcp(i,j)$表示$suf_i,suf_j$的最长公共前缀

    考虑现在如果要比较$s_i$和$s_j$.不妨设$i<j$

    首先显然的是$i$之前和$j$之后的字符串都是一样的,于是现在就只要比较$[i,j]$这一段了.

    考虑先求出$lcp(i,i+1)$,若$lcp(i,i+1)$的前缀长度大于等于$[i,j]$这一段的长度了,就说明两个字符串相等.

    否则就比较$i+lcp(i,i+1)$和$i+1+lcp(i,i+1)$的大小就成.

    于是就魔改下$cmp$直接$sort$就成$QwQ$

    法二直接一个个考虑.

    先从相邻字母不相同的部分分开始想趴$QwQ$.从$s_1$开始考虑,发现$s_1$和其他字母的首位一定不同,所以$s_1$一定要么放开头要么放末尾,放好之后考虑$s_2$,发现是一样的,于是一直这么做下去就完事$QwQ$

    欧克现在考虑相邻字母相同?发现如果相邻字母相同也就说这两个删去的效果是一样的,于是考虑缩点($bushi$,把相邻相同的字母删去,就变成了上一个问题,排好序后把缩起来的放回来就好$QwQ$.

    这样就可以直接$O(n)$把这题做掉了$QwQ$

    $over$

     

    #include<bits/stdc++.h>
    using namespace std;
    #define il inline
    #define gc getchar()
    #define ri register int
    #define rc register char
    #define rb register bool
    #define rp(i,x,y) for(ri i=x;i<=y;++i)
    #define my(i,x,y) for(ri i=x;i>=y;--i)
    
    const int N=1e6+10;
    int n,len,rl[N];
    char str[N];
    
    il int read()
    {
        rc ch=gc;ri x=0;rb y=1;
        while(ch!='-' && (ch>'9' || ch<'0'))ch=gc;
        if(ch=='-')ch=gc,y=0;
        while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc;
        return y?x:-x;
    }
    void dfs(ri nw)
    {
        if(nw==len){rp(i,rl[nw],n)printf("%d ",i);return;}
        if(str[rl[nw]]<str[rl[nw+1]]){dfs(nw+1);rp(i,rl[nw],rl[nw+1]-1)printf("%d ",i);return;}
        rp(i,rl[nw],rl[nw+1]-1)printf("%d ",i);dfs(nw+1);
    }
    
    int main()
    {
        //freopen("5329.in","r",stdin);freopen("5329.out","w",stdout);
        n=read();scanf("%s",str+1);rl[++len]=1;rp(i,2,n)if(str[i]!=str[i-1])rl[++len]=i;dfs(1);
        return 0;
    }
    View Code

     

  • 相关阅读:
    Laravel -- Excel 导入(import) (v2.1.0)
    mysql触发器
    支付宝和微信支付的坑
    php 中的引用(&)与foreach结合后的一个注意点
    oatu2.0认证原理(转)
    python3:time类
    python3练习:针对某一日期增加或减少时间、天数
    python:datetime类常用内容
    python3练习:计算日期差
    python3练习:涉及序列
  • 原文地址:https://www.cnblogs.com/lqsukida/p/11603094.html
Copyright © 2011-2022 走看看