DUToj1220: Minitrue volunteer(DP kmp)

1 篇文章 0 订阅

1220: Minitrue volunteer

Time Limit:10000/8000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)
Total Submissions:18   Accepted:2

[Submit][Status][Discuss]

Description

净化网络环境是每一个新时代青年心中之所想。作为一个新时代的六有大学生,小P十分希望网络中没有任何一点点点点点不符合社会主义核心价值观的肮脏文字。因此,他决定自愿加入净化网络空间的队伍。现在他知道了一段新的违规文本,这个文本中全部是小写字母和数字。他想知道所有长为n的只有小写字母和数字的字符串中,对于不同的结尾字符(即'a'~'z','0'~'9'),分别有多少不包含这一段违规文本,以便他对自己要举报多少违规内容先有个B数(不然他的手都要累断了)。因为他还要去学习十九大精神等重要内容,没有时间了,所以现在他拜托你来帮他搞定这个问题。

字符串A不包含字符串B,定义为“B不是A的连续子串”。

 

本题数据组数:8

Input

第一行一个字符串(长度 ≤1000)≤1000),只包含小写字母和数字,表示违规文本。

第二行一个正整数n(n≤1000)n(n≤1000),含义见题面。

Output

 36行每行一个正整数,表示以某个字母结尾的可能的不含违规文本的串的数目。这个字母第1-26行为'a'~'z',之后10行为'0'~'9'。

鉴于答案可能很大,所有的答案请对109+7109+7取模。

Sample Input

tamsm
5

Sample Output

1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679615
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616
1679616

HINT

 

 为了实现中华民族伟大复兴的中国梦而奋斗!——这是小P走之前留给你的话。

 

Source

Zeratul

[Submit][Status][Web Board]

题意:

有一个只包含小写字母和数字的字符串A(长度<=1000)。问以每一种字母或数字

为结尾且不包含字符串A的长度为n的字符串B有多少种。

解法:

dp[i][j]表示字符串前i个字符中后缀和目标字符串前缀有J个匹配且不含目标字符串的字符ge, 个数x[i][j]表示目标串前i个字符加上第j个字母('a'+j)后与目标串匹配的长度;

如果结尾字符和A结尾字符不同 ans=dp[n-1][0]+dp[n-1][1]+……+dp[n-1][m-1]; 相同就只加到m-2.

学校oj好像又出问题了0.0这题也过不了(标程能过,但是标程好像   asdasd  6   这个样例是错的)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1100;
const LL mod= 1e9+7;
char str[N];
LL dp[N][N], nex[N][N];
char str2[N]="abcdefghijklmnopqrstuvwxyz0123456789";
 
int main()
{
    int n, m;scanf("%s", str);
    scanf("%d", &n);
        string str1=str;
        m=str1.length(); 
        memset(dp,0,sizeof(dp));
        memset(nex,0,sizeof(nex));
        dp[0][0]=1;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<36;j++)
            {
                string s=str1.substr(0,i)+str2[j];
                while(str1.substr(0,s.length())!=s) s=s.substr(1);
                nex[i][j]=s.length();
            }
        }
        for(int t=0;t<n;t++)
        {
            for(int i=0;i<m;i++)
            {
                for(int j=0;j<36;j++)
                {
                    int ti=nex[i][j];
                    if(ti==m) continue;
                    dp[t+1][ti]=(dp[t+1][ti]+dp[t][i])%mod;
                }
            }
        }
        LL ans=0;LL ans2=0;
        for(int i=0;i<m;i++) ans=(ans+dp[n-1][i])%mod;
        ans2=ans-dp[n-1][m-1]+mod;
        ans2%=mod;
        for(int i=0;i<36;i++)
        {
        	if(str2[i]==str[m-1]){
        		printf("%lld\n",ans2);	
			}
			else{
        printf("%lld\n",ans);				
			}
		}
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值