[日常训练]article

Description

今天来写作文啦!
非常善于堆砌辞藻。在洋洋洒洒写了一长篇之后,小发现作文中很多段落都似曾相识。小认为,如果一段字符在文章开头,结尾和中间都出现过,那么这段字符就可以被认为是一个“经典段”。
现在小给你一篇文章,他想知道最长的一段“经典段”长度是多少?
注意,这里要求经典串至少出现三次,分别作为文章的前缀,后缀,及既非前缀也非后缀。

Input

一行,给出一个由小写字母组成的字符串。

Output

输出满足题目要求的非空子串,如果不存在这样的非空子串输出。(字符串严格匹配,不含双引号)

Sample Input

fixprefixsuffix

Sample Output

fix

HINT

字符串长度

Solution

预处理出这个字符串能与后缀匹配的前缀最长子串.

数组求出中哪些下标使得后缀.

匹配,求出最大的使得后缀.

#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 1000005
using namespace std;
int nxt[N],n,ans;
bool f[N];
char a[N],b[N],c[N];
inline void get_nxt(char b[],int n){
    for(int i=2,j=0;i<=n;++i){
        while(j&&b[j+1]!=b[i]) j=nxt[j];
        if(b[j+1]==b[i]) ++j;
        nxt[i]=j;
    }
}
inline void kmp1(){
    int k=0;
    for(int i=1,j=0;i<n;++i){
        while(j&&b[j+1]!=a[i]) j=nxt[j];
        if(b[j+1]==a[i]) ++j;
        if(i==n-1) k=j;
    }
    while(k){
        //printf("k=%d\n",k);
        f[k]=true;k=nxt[k];
    }
}
inline int kmp2(){
    int ret=0;get_nxt(a,n);
    for(int i=2,j=0;i<n;++i){
        while(j&&c[j+1]!=c[i]) j=nxt[j];
        if(c[j+1]==c[i])
            if(f[++j]) ret=max(ret,j);
    }
    return ret;
}
inline void print(){
    printf("Y can‘t find any classical string.\n");
}
inline void init(){
    scanf("%s",c+1);n=strlen(c+1);
    if(n<3){
        print();return;
    }
    for(int i=n,j=1;i>1;--i,++j)
        b[j]=c[i];
    for(int i=n-1,j=1;i;--i,++j)
        a[j]=c[i];
    get_nxt(b,n-1);kmp1();
    ans=kmp2();
    if(ans){
        for(int i=ans;i;--i)
            printf("%c",b[i]);
        printf("\n");
    }
    else print();
}
int main(){
    freopen("article.in","r",stdin);
    freopen("article.out","w",stdout);
    init();
    fclose(stdin);
    fclose(stdout);
    return 0;
}
时间: 2024-10-05 22:04:52

[日常训练]article的相关文章

「知识学习&amp;日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)

题意 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\(k\). 也就是说,对于所有的\(x,y (l\le x\le y\le r)\),能够满足\(a[x]\oplus a[x+1]\oplus ...\oplus a[y]=k\)的\((x,y)\)有多少组. 分析 对于这种离线区间的查询问题(不涉及对区间的更改),我们可以使用莫队算法解决.这类问题是什么类型?对于序列上的区间询问

「日常训练与知识学习」树的分块(王室联邦,HYSBZ-1086)

题意与分析 这题的题意就是树分块,更具体的看题目(中文题). 学习这一题是为了树的分块,为树上莫队做铺垫. 参考1:https://blog.csdn.net/LJH_KOQI/article/details/52326103 参考2:https://blog.csdn.net/popoqqq/article/details/42772237 注意到题目要求某块区域所有的点到根的路径上的点都属于该区域.因此不能够暴力地去dfs,每找到\(B\)个分一块是不可取的,因为无法保证联通性(一颗子树的下

[日常训练]yayamao的神题

Description $yayamao$是数学神犇,一天他在纸上计算起了$1/P$, 我们知道按照模拟除法可以得到准确解,例如$1/7=0.(142857),1/10=0.1(0)$.$yayamao$发现无论他如何模拟小数都会出现循环,现在$yayamao$想知道循环的长度以及循环出现之前,小数点后面的未循环的数字的位数.例如$1/15=0.0(6)$,那么它的循环长度为$1$,小数点后面的未循环的数字的位数为$1$;$1/4=0.25(0)$,那么它的循环长度为$1$,小数点后面的未循环的

[日常训练]最大M子段和

Description 在长度为的序列中选出段互不相交的子段,求最大字段和. Input 第一行两个整数. 第二行个整数. Output 一行一个整数表示最大值. Sample Input 5 2 10 -1 10 -1 10 Sample Output 29 HINT Solution 如果序列中正整数个数,直接取最大的个数的和即可. 将序列合并成若干个交错的正负段和,如-1,-2,3,4,-5,-6可以合并成-1-2,3+4,-5-6. 记录所有正数段之和,设正数段个数为,则需要把k段正数段

[日常训练]curves

Description 小同学的弟弟小昨天学习了数学中的一元二次函数,但是由于学业不精,他一个晚上都在缠着小问一元二次函数的极值问题,小烦不可耐,于是,想请你帮忙弄个程序来应付小.程序要完成以下任务: 给你个二次函数,记第个为:. 设函数. 请你求出的在区间上的最小值,结果保留位有效数字. Input 输入文件第一行是一个整数. 接下来行,每行个实数,之间有一个空格分隔. Output 输出一行一个实数,表示的在区间上的最小值. Sample Input 2 3 --2 1 2 -4 2 Sam

[日常训练]大灾难

Description 在一个生态圈中,食物链的维系是很重要的.食物链的断裂往往引起连锁反应,进而招致生态系统如同多米诺骨牌一样坍塌. 现在考虑一个简化模型.在一个生态系统中,有$N$种生物,它们分为两类:生产者与消费者.生产者通过这个系统之外的能量来生存,最常见的是植物的光合作用.而消费者需要"消费",也就是以其他生物为食物才可以生存.为了简化问题,我们假设所有消费者是可以分层的,高一层的消费者可能的食物来源都来自它的严格下层.生产者可以视为最下层的成员.当一种生物灭绝之后,依赖于它

[日常训练]变戏法

Description 一开始有$n$个只有颜色不同的小球.定义使用一次膜法的效果是重新排列第$l_i$个到第$r_i$个小球.给定了$n$个小球的初始状态和最终状态,以及$m$次膜法的范围$l_i,r_i$.判断是否可以从初始状态转移到最终状态. Input 第一行有一个整数$t$表示数据组数. 每组数据中, 第一行两个整数$n,m$,表示总共有$n$个小球,$m$次操作. 第二行$n$个整数$a_i$,表示初始状态. 第三行$n$个整数$b_i$,表示最终状态. 接下来$m$行,每行两个整数

[日常训练]training

Description 一条线上有栋楼,第栋楼有层,每层有1个价值为的物品. 可以花费1个单位时间完成以下3种移动: 1.在同一栋楼中向上或者向下走一层; 2.如果此刻在顶楼,可以通往1楼; 3.从当前楼移动到相邻楼的同层.如果相邻楼没有当前位置高,则会落到相邻楼的顶层. 初始时在第一栋楼的顶层,单位时间可以移动,拿去物品不需要时间,且一个物品被拿一次之后就会消失. 求能获得的最大的总价值. Input 第一行两个正整数. 以下行每行两个整数表示和. Output 输出一行一个整数表示最大的总价

[日常训练]school

Description 众所周知,家离学校很远.于是,每天算准了时间出发,以保证能在上课铃响前 秒到达学校. 不幸的是,市最近正在修路.这就导致有些路可能无法通行,因而可能导致迟到. 不打算改变他的出发时间,现在他告诉你他通过每一条路的时间,他想要知道如果某条路被维修了,那么他是否能避免迟到? Input 第一行输入两个正整数,分别表示点数(路口)和边数(路). 第二行输入两个正整数,表示家标号为,学校标号为. 接下来行,每行三个整数,表示有一条连接的道路,走过该路所需的时间为. 接下来一个整数