汕头市队赛 SRM19 字符题

从天上掉下来了个这样的问题:

有一个字符串 从中选出两个子串 A,B,求 A+B可以构成的不同串的个数。 还想知道,这么多个串中字典序最大的那一个。

某人捡到了这个问题,并把它扔给了你。

【输入】

一个全由小写字母构成的字符串。

【输出】

第一行 一个非负整数,表示两个子串A+B可以构成的不同串个数。由于答案可能很大,所以答案对1004535809取模。

第二行 一个字符串,表示构成的串中字典序最大的。

【样例输入1】

ab

【样例输出1】

11

bb

【样例输入2】

abcaabccba

【样例输出2】

1428

ccccba

【数据范围及约定】

n=|S|

10% n<=10

30% n<=40

另有20%  字符串由1个a和n-1个b构成

100% n<=2000

【提示】

两个子串均可为空,但不同时为空。

这道题我们可以建一棵trie树记录所有子串 计算呢为了防止算重复

我们可以枚举一个子串末尾加上某个字母后是否还是子串

然后就搞来搞去就可以了 至于最大的话就跑一下字典序最大的子串

前面再扔整个序列里面最大的那个字母 能扔几个是几个

#include<cstdio>
#include<cstring>
#include<algorithm>
const int M=5e3+7,mod=1004535809;
int read(){
    int ans=0,f=1,c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();}
    return ans*f;
}
char ch[M],ansq[M];
int ans,s[M],cnt,n,cntq;
int c[2000007][27];
void insert(int k){
    int rt=0;
    for(int i=k;i<=n;i++){
        if(!c[rt][s[i]]) c[rt][s[i]]=++cnt;
        rt=c[rt][s[i]];
    }
}
int A[26],B[26];
int dfs(int p){
    int sz=1;
    for(int i=0;i<26;i++){
        if(!c[p][i]) A[i]+=(p!=0);
        else if(!p) B[i]=dfs(c[p][i]);
        else sz+=dfs(c[p][i]);
    }
    return sz;
}
int main(){
    scanf("%s",ch+1);
    n=strlen(ch+1);
    for(int i=1;i<=n;i++) s[i]=ch[i]-‘a‘;
    for(int i=1;i<=n;i++) insert(i);
    dfs(0);
    for(int i=0;i<26;i++) ans=(ans+1LL*(A[i]+1)*B[i]%mod)%mod;
    printf("%d\n",ans);
    int rt=0;
    while(1){
        for(int i=25;i>=0;i--)if(c[rt][i]){
            ansq[++cntq]=i+‘a‘;
            rt=c[rt][i]; goto o;
        }
        break;
        o:;
    }
    for(int i=1;i<=cntq;i++)
        if(ansq[i]==ansq[1]) putchar(ansq[i]);
        else break;
    printf("%s",(ansq+1));
    return 0;
}

时间: 2024-10-25 11:24:05

汕头市队赛 SRM19 字符题的相关文章

汕头市队赛 C KMP codeforces B. Image Preview

汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> #include<cstring> #include<algorithm> #define LL long long using namespace std; const int M=1e6+7; LL read(){ LL ans=0,f=1,c=getchar(); while(c

汕头市队赛 SRM10 T1模拟只会猜题意

模拟只会猜题意 SRM 10 描述 有一本n个单词的词典,求按下列方法能造出的不相同的词汇数目.  1.词典中的单词是一个词. 2.能分为两部分的,其中前一部分是一个词典词或者其非空前缀,后一部分是一个词典词或者其非空后缀的词. 输入格式 第一行一个整数n,接下来n行每行一个字符串,表示单词 输出格式 一个整数,答案 样例输入 3 a ab bc 样例输出 20 数据范围与约定 对10%的数据,n=1 对另外40%的数据,1<=n<=10,单词只含字符'a' 对所有的数据,1<=n<

汕头市队赛SRM15

T1--czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老鼠. 共有N个仓库,编号1-N. 假设陵陵在第i个仓库点燃艾条,烟雾就会充满该仓库,并向左右扩散Ai 的距离,接着所有|i-j|<=Ai 的仓库 j 的老鼠被消灭. 陵陵是个爱护环境的人,他想知道最少需要多少支艾条,才可以消灭所有老鼠. [输入格式] 第一行:一个正整数,代表 N. 第二行:N 个非

汕头市队赛 SRM 09 A 撕书

A 撕书I-3 SRM 09 背景&&描述 琉璃在撕书.     书总共有n页,都悬浮在数轴上,第i页的位置为,上面写着一个数字.     琉璃从右往左撕书.假如看到了第i页,就把在第i页左边,且与之距离<=的书都撕掉.(第i页本身不撕)     夜子为了尽量地保全魔法书,决定偷偷在琉璃开始撕之前,增加一页.增加的这一页必须在所有书页的右边,数字随意.     夜子想知道,最少会有多少页书被撕毁. 输入格式 第一行一个整数n,表示书页数. 接下来n行,第i行的俩整数分别为和. 输出格

汕头市队赛 SRM 09 B 撕书

B 撕书II-3 SRM 09 背景&&描述 琉璃手头有一黑一白两本魔法书,一本是<缟玛瑙的不在证明>,另一本是<白色相簿1.5>     传说同时打开这两本书会有奇怪的事情发生.     琉璃打开一看,果然非常奇怪:两本书上都各自写着一个正整数(可能他买到盗版了),分别是a和b.     试图撕书的汀想借过来看看,但琉璃只告诉了他这俩数加起来的值x和异或起来的值y.     汀发现有很多种(a,b)满足琉璃告诉他的信息...你能帮他算出来有多少种吗? 输入格式 两

汕头市队赛 SRM 09 C 撕书

C 撕书III-3 SRM 09 背景&&描述 琉璃双在撕书.     书总共有n页,每页都可以看作是一个数字.     琉璃读书喜欢来回地读.但他也因此发现了作者的灌水行为:有些连续的若干页正着读和倒着读完全一样,也就是说是回文的.     发生这种情况时,琉璃会非常地angry,把那些书页给撕掉.     汀捡到了本黑色的魔法书.因为担心杀死书后会带来麻烦,决定借琉璃的手把书处置掉.     大概就是每次选出剩余书页中的一个回文子串,拿给琉璃看....     汀比较懒,他想知道最少选

{CodeForces】788E New task &amp;&amp; 汕头市队赛SRM06 D 五色战队

D 五色战队 SRM 06 背景&&描述 游行寺家里人们的发色多种多样,有基佬紫.原谅绿.少女粉.高级黑.相簿白等. 日向彼方:吾令人观其气,气成五彩,此天子气也. 琉璃:我们是不是可以组个五人战队了? 游行寺家的n个人排成一排.第i个人的发色是Ai. 能组成战队的条件是: 那五人假设是第a,b,c,d,e人(),需要满足  中间的三人称为有头者,最旁边俩人称为学姐. 根据字面意思,有头者一定要有头,学姐可以无头.                 反正就是b,c,d这三人一定要有头. 有着

汕头市队赛 yyl杯1 T1

A SRM 05 - YYL 杯 R1 背景 傻逼题 描述 给一个序列,序列里只有两种元素1和2.现在要从序列里选出一些非空子序列使得子序列里两种元素数量相同.问有多少种方案数? 输入格式 多组数据 第一行一个正整数T,表示数据组数. 每组数据内 第一行 两个个正整数n,表示序列的长度 第二行 n个数字,表示整个序列. 输出格式 一个整数,表示方案数(mod 1e9+7). 样例输入 1 3 2 2 1 样例输出 2 数据范围与约定 样例解释 在第一个样例中,两个子序列分别为{1,3},{2,3

汕头市队赛 SRM13 T3

这道题可以贪心 维护一个答案队列 枚举位置 每次将比当前位置大的队尾全部替代掉 记录删了多少了就好了 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<string> #define LL long long using namespace std; const int M=1e7+7; int n,k,cnt; char s[M]