牛客网多校3 Sort String(后缀数组DC3)

题目:就是给你一个串,对于第i个位置,你可以把前i个字符放到队尾形成一个新的字符串,问你最后一共有几个字符串

DC3卡过去了hhhh

#include
#include
#include
#include
#define F(x) ((x)/3+((x)%3==1?0:tb))
#define G(x) ((x)=0;i--)
        b[--wss[wv[i]]]=a[i];
}
void dc3(int *r,int *sa,int n,int m)
{
    int i,j,*rn=r+n;
    int *san=sa+n,ta=0,tb=(n+1)/3,tbc=0,p;
    r[n]=r[n+1]=0;
    for(i=0;i
vectorans[maxn];
int main()
{
    scanf("%s",s);
    n=strlen(s);
    m=n;
    for(int i=0;i=1&&sa[k-1]<=m&&height[k]>=m)
        {
            k--;
            if(sa[k]==m) continue;
            book[sa[k]]=1;
            ans[num].push_back(sa[k]);
        }
        k=ra[i];
        while(k+1=m)
        {
            k--;
            if(sa[k]==m) continue;
            book[sa[k]]=1;
            ans[num].push_back(sa[k]);
        }
    }

    printf("%d\n",num);
    for(int i=1;i<=num;i++)
    {
        printf("%d",ans[i].size());
        sort(ans[i].begin(),ans[i].end());
        for(int j=0;j

kmp的算法

#include
using namespace std;
const int maxn=1e6+10;
int net[maxn],flag;
void kmp_pre(char x[],int m)
{
    int i,j;
    j=net[0]=-1;
    i=0;
    while(i-1&&x[i]!=x[j])
            j=net[j];
        net[++i]=++j;
    }

    if(m%(m-net[m])==0&&net[m]>0)//找寻环节
        flag=m-net[m];
}
int n;
char s[maxn];
int main()
{
    scanf("%s",s);
    n=strlen(s);
    flag=0;
    kmp_pre(s,n);
    if(flag)
    {
        printf("%d\n",flag);
        int num=n/flag;
        for(int i=0;i

比赛时过题的hash哈希

#include 
using namespace std;
typedef unsigned long long ll;
const int maxn=2e6+10;
ll p[maxn],ha[maxn];
const ll bas=31;
char s[maxn];
int n;
ll findha(int l,int r)
{
    return ha[r]-ha[l-1]*p[r-l+1];
}
struct node{
    int id;
    ll w;
}ma[maxn];
struct node1{
    int fi;
    vectora;
}ans[maxn];
bool cmp(const node &a,const node &b)
{
    if(a.w==b.w) return a.id

 

你可能感兴趣的:(字符串,后缀数组,多校)