P4965 薇尔莉特的打字机

题目背景

只要客人有意向,不论身在何处,都能上门服务。我是自动手记人偶服务——薇尔莉特·伊芙加登。

题目描述

薇尔莉特的打字机用了太久,按键已经开始老化了,因此有时候按键会没有反应。而薇尔莉特总是盲打,因此按键没反应她也不会注意到。一天,她用这台打字机继续完成一封还没写完的信。

现在告诉你这封信已经写好的部分以及薇尔莉特想进行的操作,薇尔莉特想进行的操作有两种:

  1. 在信的末尾输入一个大写字母
  2. 进行一次退格

退格用小写字母 \mathrm{u}u 表示,即删除当前信中的最后一个字符,当然,在信为空时退格没有任何作用。

薇尔莉特会按顺序按下她想按的按键,而每次薇尔莉特按下一个键(输入一个大写字母或进行一次退格),都有可能没有反应(即这次操作无效)。请问,最后打出来的信有多少种可能呢?(空信也算信)

当然薇尔莉特只想知道可能数对 0x125E591(十六进制) 取模的结果。

输入输出格式

输入格式:

 

第一行两个正整数 n,\ mn, m 分别表示已经写好的信的长度和薇尔莉特想进行的操作数(字符个数+退格个数)。

第二行一个长度为 nn 的字符串表示已经写好的信,保证该串中的每个字符都为大写字母。

第三行一个长度为 mm 的字符串表示薇尔莉特想进行的操作,保证该串中的每个字符都为大写字母或 \mathrm{u}u。

 

输出格式:

 

一个整数表示答案对 0x125E591 取模的结果。

 

输入输出样例

输入样例#1: 复制
2 4
AB
AuAB
输出样例#1: 复制
9
输入样例#2: 复制
10 5
AABBAACBAC
ABAAC
输出样例#2: 复制
20
输入样例#3: 复制
1 3
U
uUu
输出样例#3: 复制
3

说明

1\le n,\ m\le 5\times 10^61n, m5×106

样例解释

样例一:可能的 99 种信为:A,AA,AB,AAB,ABA,ABB,ABAA,ABAB,ABAAB

样例二:太多了,略

样例三:可能的 33 种信为:,U,UU

这题的模数为什么这么奇怪应该不用我解释了

注:在本文中序列加法定义为拼接两个序列成一个序列。如:\{A,B\}+\{C\}=\{A,B,C\}{A,B}+{C}={A,B,C}

思路

 

 

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 
 6 using namespace std;
 7 
 8 const int maxn=1e7+10;
 9 const int mod=0x125E591;
10 
11 char s[maxn],t[maxn];
12 int n,m,list[300],pre[maxn],pos,cnt,dp[maxn],ans;
13 int DP(char x)
14 {
15     if(list[x])
16     {
17         return mod-dp[pre[list[x]]];
18     }
19     else
20     return 1;
21 }
22 int tot=0;
23 
24 int main()
25 {
26     memset(dp,0,sizeof(dp));
27     int i;
28     cin>>n>>m; 
29     scanf("%s%s",s,t);
30     for (i=0;i<m;++i)
31     {
32         if(t[i]=='u')
33         {
34             tot++;
35         }
36     }
37     //cout<<cnt<<endl<<tot<<endl;
38     for (i=m-1;i>=0;--i)
39     {
40         if (t[i]!='u')
41         {
42             pre[i]=pos;
43             dp[i]=(2*dp[pos]+DP(t[i]))%mod;
44             pos=list[t[i]]=i;
45         }
46         else
47         {
48             if (n-tot>=0) 
49             {
50                 ans=(ans+dp[pos]+DP(s[n-tot]))%mod;
51             }
52             --tot;
53         }
54     }
55     ans=(ans+dp[pos]+1)%mod;
56     cout<<ans<<endl;
57     return 0;
58 }

 

转载于:https://www.cnblogs.com/2529102757ab/p/10913839.html

分数阶傅里叶变换(Fractional Fourier Transform, FRFT)是对传统傅里叶变换的拓展,它通过非整数阶的变换方式,能够更有效地处理非线性信号以及涉及时频局部化的问题。在信号处理领域,FRFT尤其适用于分析非平稳信号,例如在雷达、声纳和通信系统中,对线性调频(Linear Frequency Modulation, LFM)信号的分析具有显著优势。LFM信号是一种频率随时间线性变化的信号,因其具有宽频带和良好的时频分辨率,被广泛应用于雷达和通信系统。FRFT能够更精准地捕捉LFM信号的时间和频率信息,相比普通傅里叶变换,其性能更为出色。 MATLAB是一种强大的数值计算和科学计算工具,拥有丰富的函数库和用户友好的界面。在MATLAB中实现FRFT,通常需要编写自定义函数或利用信号处理工具箱中的相关函数。例如,一个名为“frft”的文件可能是用于执行分数阶傅里叶变换的MATLAB脚本或函数,并展示其在信号处理中的应用。FRFT的正确性验证通常通过对比变换前后信号的性来完成,比如评估信号的重构质量、信噪比等。具体而言,可以通过计算原始信号与经过FRFT处理后的信号之间的相似度,或者对比LFM信号的关键参数(如初始频率、扫频率和持续时间)是否在变换后得到准确恢复。 在MATLAB代码实现中,通常包含以下步骤:首先,生成LFM信号模型,设定其初始频率、扫频率、持续时间和采样率等参数;其次,利用自定义的frft函数对LFM信号进行分数阶傅里叶变换;接着,使用MATLAB的可视化工具(如plot或imagesc)展示原始信号的时域和频域表示,以及FRFT后的结果,以便直观对比;最后,通过计算均方误差、峰值信噪比等指标来评估FRFT的性能。深入理解FRFT的数学原理并结合MATLAB编程技巧,可以实现对LFM信号的有效分析和处理。这个代码示例不仅展示了理论知识在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值