zoukankan      html  css  js  c++  java
  • 「SNOI2019」字符串

    题目链接:Click here

    Solution

    事实上,我们发现我们比较的两个字符串是极为相似的

    设我们当前要比较的两个字符串为(s_x)(s_y),而他们不同的地方就在于原串(xsim y)的部分

    而这一部分也是十分相似的,准确的来说,他们对应的位置在原串中事实上是位置相邻的点

    则我们只需要记录每个点后第一个相邻位置值不同的位置,再魔改一下(cmp)就行了

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+11;
    char s[N];
    int n,nxt[N],p[N];
    inline bool cmp(int x,int y){
        int v=nxt[min(x,y)];
        if(v<max(x,y)){
            if(x<y) return s[v+1]<s[v];
            else return s[v]<s[v+1];
        }else return x<y;
    }
    int read(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
        while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
        return x*f;
    }
    signed main(){
        n=read();
        scanf("%s",s+1);nxt[n]=n;
        for(int i=n-1;i;i--){
            if(s[i]!=s[i+1]) nxt[i]=i;
            else nxt[i]=nxt[i+1];
        }
        for(int i=1;i<=n;i++) p[i]=i;
        sort(p+1,p+n+1,cmp);
        for(int i=1;i<=n;i++) printf("%d ",p[i]);
        return 0;
    }
    
  • 相关阅读:
    机器学习之朴素贝叶斯
    机器学习之KNN
    格式化数字
    web.xml中load-on-startup的作用
    ExecutorService线程池
    201404转成 2014.04
    DBCP连接池配置示例
    java 写文本换行
    打印IP 来源
    MySQL分库分表的一些技巧
  • 原文地址:https://www.cnblogs.com/NLDQY/p/11668261.html
Copyright © 2011-2022 走看看