squee_spoon and his Cube VI---郑大校赛(求最长子串)

市面上最常见的魔方,是三阶魔方,英文名为Rubik‘s Cube,以魔方的发明者鲁比克教授的名字命名。另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小;四阶魔方叫Revenge Cube,这是因为就算你好不容易复原了三阶魔方,四阶魔方也会向你“复仇”;而五阶魔方叫Professor Cube,人们认为只有专家才能够复原这么复杂的魔方。

作为ACM(A Cube Master),squee_spoon准备为九阶正十二面体魔方命名,此时他的脑中浮现出一个长长的字符串S,似乎可以作为魔方的英文名。但是问题没有那么简单,squee_spoon有n个不喜欢的短字符串a1~an,所以squee_spoon希望将九阶正十二面体魔方命名为S的最长子串T,在这个子串中,不能包含a1~an,即a1~an均不是T的子串。

Input

多组数据。

第一行,字符串S,长度不会超过10^5。

第二行,一个整数n,1<=n<=10。

接下来的n行,n个字符串a1~an,ai的长度不会超过10。

Output

对于每组数据,输出两个整数,分别是T的长度及其在原串S中的起始下标(下标从0开始,如果存在多解,输出最小的起始下标)。

Sample Input

orz_zzuspy 2 orz us YM_2030xxj 3 _20 03 M_

Sample Output

6 1 5 5

HINT

Source

郑大第九届校赛正式赛

和之前做的一道题几乎一样,但是上次那道题太水,错的代码交了也是对的;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define N 100010
using namespace std;
struct node
{
    int L, R;
} a[N];
char s[N];

int cmp(node p, node q)
{
    if(p.L!=q.L)
        return p.L<q.L;
    return p.R<q.R;
}

int main()
{
    char s0[N];
    int n,k, Len;
    while(scanf("%s", s)!=EOF)
    {
        memset(a, 0, sizeof(a));
        Len=strlen(s);
        scanf("%d", &n);
        k=1;
        for(int i=1; i<=n; i++)
        {
            scanf("%s", s0);
            if(strstr(s, s0)!=NULL)
            {
                int pos = 0;
                int len = 0;
                while(strstr(s+pos+len, s0)!=NULL)
                {
                    pos = strstr(s+pos+len, s0)-s;
                    len = strlen(s0);
                    a[k].L=pos;
                    a[k++].R = pos+len-1;
                    len=1;///查找时要考虑以下数据:回文串;
                }
            }
        }
        sort(a+1, a+k, cmp);
        a[k].L=0, a[k].R = Len;///防止出现k=1的情况;
        int Max=0, Index=-1;
        for(int i=2; i<k; i++)
        {
            int len1=a[i].R-a[i-1].L-1;
            int len2=a[i-1].R-a[i].L-1;///如果a[i].R<a[i-1].R;

            if(len1>Max)
            {
                Max = len1;
                Index = a[i-1].L+1;
            }
            if(len2>Max)
            {
                Max = len2;
                Index = a[i].L+1;
            }
        }

        if(a[1].R>=Max)///与开头和结尾的相比较;
        {
            Max = a[1].R;
            Index = 0;
        }
        if(Len-a[k-1].L-1>Max)
        {
            Max = Len - a[k-1].L-1;
            Index = a[k-1].L+1;
        }
        printf("%d %d\n", Max, Index);
    }
    return 0;
}
/*
tstst
1
tst
abcde
1
ac

3 1
5 0
*/

时间: 2024-10-29 19:07:11

squee_spoon and his Cube VI---郑大校赛(求最长子串)的相关文章

郑大校赛

总结:水平太菜: Problem B: make pair Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 53  Solved: 40SubmitStatusWeb Board Description pair<T,T>是c++标准模板库中一种十分有用的模板类型,它是一个二元组.我们可以用它来表示一个二维坐标点,人的身高体重等等.make_pair()函数可以方便地构造一个pair. 现在有一个长度为n的整数数组a1~an(可以存在相同的元素)

2014东北农大校赛--D.Cross the middle (任意两点最短路径 Floyd)

Cross the middle Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 36  Solved: 13 [Submit][Status][Web Board] Description n个点的图,给出任意两点之间的距离,m个询问,每次询问Mid是否可能出现在从Start到End的最短路径上. Input 第一行n,m 接下来是一个n*n的邻接矩阵,w[i][j]表示i到j的距离 接下来m行 每行start,end,mid N,m<=100,

2014东北农大校赛--A. Paint it! (预处理)

1141: A.Paint it! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 13  Solved: 10 [Submit][Status][Web Board] Description 有一个n*m的棋盘,每个格子只可能是黑和白两种颜色,你可以使用染料将某个格子染成黑色或者白色.求最少需要染多少个格子, 能使当前的棋盘变成类似于国际象棋的棋盘(每个格子临边的四个格子颜色都不与该格子的颜色相同). Input n m(n,m<=100) 接下

2014工大校赛题目以及解

a,b题不说. c题思路是每次枚举俩个点,用半径R确定最大的圆(这样的圆有俩个,求圆心手算有点小麻烦),更新最大值,3次方的,100个点,不会超时. D题是枚举+贪心,所有物品一共只能是N+1种被拿的情况:要么全是用R(该位子是若用右手标记R,若用左手标记L):RRR...RRR,或者第一个物品用L:LRRR...RR,.....依次到LLLLLL..LLL,一个序列来记录每个物品是被左手还是右手拿.枚举所有序列,如LLL...RRR,贪心:那必然是一次L一次R,多出来的需要额外开销能量.如LL

ZZUOJ - 10377 - squee_spoon and his Cube III (DP)

10377: squee_spoon and his Cube III Time Limit: 2 Sec  Memory Limit: 128 MB Submit: 70  Solved: 22 [Submit][Status][Web Board] Description As we all know, pupil squee_spoon plays Rubik's Cube every day. He registered a Cube competition recently. Many

川大/电子科大校赛

第一次出校比赛 比赛时间: 电子科技大学校赛:2015.4.4 周六 四川大学校赛:2015.4.6 周一 之前本以为可以愉快地正大光明地不上课出去玩玩,不过后来才发现正值清明节,好像亏了,并不能好好滴玩耍,不过少上了4节课也是不错的,哈哈. 4.3 上午11点从学校出发,坐27路公交到圣水寺转车,然而发现时间并不多了,于是打车赶到火车站,无奈排队取票和进站的人都多得不行,看来之前小框框建议早点走是极为明智的,毕竟假期,无形甩锅....好不容易取到票出来但是进站的队伍又好长好长,只有10分钟点车

杭师大校赛总结

感想: 这次校赛总有些遗憾,有两道题目我总觉得可以做出来,但是却又没做出来, 一个是没有将以前做过的题目的规律总结,就是没有好好的整理以前的知识点, 还有就是做题的速度太慢了,H题到了最后才想出一个新的点子,还没来得及实现比赛就结束了. 总的来说,我觉得比赛就是考察5个方面,速度,细节,模板(可能不太常用),语言(包括C++)和配合, 只要抓住这几个方面就好了,就我而言,还要提高速度,注重细节,不断总结,完善自己的模板. 相信下一次我一定能够A更多的题. 原文地址:https://www.cnb

2019武科大校赛游记

我佛了,刚刚登博客用户名密码一起出锅,还好我机智尝试多次爬了进来. 这次的校赛纯属意外,本来这段时间的计划只不过是好好弄弄紫书上的题,结果看见Google赞助就脑子不拎清报名了,报名过程依旧很曲折,但我不想多说,总之就是随便找了个同学一起去玩了,由于没有前期磨合,甚至两个人完全不熟,所以最后很惨ORZ. 开局我们就很顺利找到了M是签到,然后光速过了.接着队友信誓旦旦和我说有一道是矩阵快速幂,然后我找了板子他去写...好像一个小时里T了无数次...在他自闭的时候我看出I是一道可做的,把三种情况和公

2017北大校赛 J题 pairs

题目链接 http://poj.openjudge.cn/practice/C17J/ orz 原来是一道无脑枚举题目 只是很卡常数而已 复杂度算错也是很醉orz 当时怎么没想着优化常数呢 题解:枚举x,p,y,就可以了 当然,普通暴力枚举肯定会超时,复杂度是M^1.5 (一开始算的是M^1.5logM,实际上算错了,因为M + M/4 + M/9 + .... 不超过2*M) 我们考虑预处理一些部分,其实就是预处理出每个数i的小于sqrt(i)的所有约数 这个复杂度实际上是MlogM 之后我们