Noi 十连测 人生的经验

Posted 殇雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Noi 十连测 人生的经验相关的知识,希望对你有一定的参考价值。

 SOL:

   那个,其实这道题爆搜能过。正解好像是建模后求欧拉回路。

  

  

#pragma GCC optimize("-Ofast")
#include<bits/stdc++.h>
using namespace std;
int len,c,l; int no;
char ch[29];
bool usd[11001009];
unsigned char dla[11001009],now[11001009];
#define sight(c) (‘0‘<=c&&c<=‘9‘)
inline void read(int &x){
    static char c;
    for (c=getchar();!sight(c);c=getchar());
    for (x=0;sight(c);c=getchar())x=x*10+c-48;
}
int ple,pl,pll;
inline bool tr(int x){
    if (x==c) return 0;
    return usd[no+x];
}
void sol(int c,int l){
    len=pow(c,l)+l-1; ple=pow(c,l); pl=pow(c,l-1); 
    usd[0]=1; //q[0]++; qq[0]++; qqq[0]++;
    for (int i=l+1;i<=len;i++,no=no*c-ple*now[i-l]) {
        now[i]=now[i]+dla[i]; dla[i]=0;
        while (tr(now[i])) now[i]++;
        if (now[i]>=c) {
          now[i]=0; 
          no=(no+ple*now[i-l])/c; i--;
          no=(no+ple*now[i-l])/c; i--;
//          no=(no+ple*now[i-l]*c+ple*now[i-l-1])/(c*c); i-=2;
          usd[no*c-ple*now[i-l+1]+now[i+1]]=0; dla[i+1]++;
        } else {
        no+=now[i]; usd[no]=1;
        }
    }
}
signed main () {
    freopen("life.in","r",stdin);
    freopen("life.out","w",stdout);
    read(c); read(l);
    sol(c,l);
    scanf("%s",ch);
    printf("%d\n",len);
    for (int i=1;i<=len;i++) putchar(ch[now[i]]);
    return 0;
}

 

以上是关于Noi 十连测 人生的经验的主要内容,如果未能解决你的问题,请参考以下文章

Noi 十连测 建造记者站

NOI十连测 第五测 T1

NOI十连测 第六测 T1

NOI十连测 第五测 T2

[Noi2016十连测第三场]线段树

BZOJ NOI 十连测 哈夫曼树