codeforces 645e

来源:互联网 发布:数据建模师 编辑:程序博客网 时间:2024/06/04 19:53

题意:在原字符串加上n个字符(1e6)  使得他的不同子串数量最多 字符范围为k


思路:先考虑放一个字符 会有生成多少个新字串 ,那么我们来统计现在如果包含这个字符的子串,由于这个字符是放在最后的,所以,字串增加数量就是*2,但是有重复的部分没有减去,那么什么字串会重复呢?  由于是最后一个字符,所以重复的肯定是上次出现字符放到最后以后形成的所有子串,那么减去这个数,就可以得出新加了多少串。

然后我们考虑到底加那个字符增加最多?那应该是减去最少的 就是增加最多的。


#include<stdio.h>#include<string.h>#include<vector>#include<algorithm>#include<queue>#include<math.h>#include<string>using namespace std;#define LL long long#define MOD 1000000007#define N 10000010LL sum[30];int n,m;char ch[N];int pos[30];int main(){    scanf("%d%d%s",&n,&m,ch);    LL ans=1;    for(int i=0;ch[i];i++)    {        int temp=ch[i]-'a';        LL pre=ans;        ans=((ans*2-sum[temp])%MOD+MOD)%MOD;        sum[temp]=pre;        pos[temp]=i+1;    }    int nx=strlen(ch);    for(int i=0;i<n;i++)    {        int x=N,y=0;        for(int j=0;j<m;j++)        {            if(pos[j]<x)            {                x=pos[j];                y=j;            }        }        LL pre=ans;        ans=((ans*2-sum[y])%MOD+MOD)%MOD;        sum[y]=pre;        pos[y]=i+1+nx;    }    printf("%lld\n",ans);    return 0;}


0 0
原创粉丝点击