c++ - 解决方案中的值 x 表示什么?
问题描述
问题陈述::
给定一个由大写字母组成的字符串“s”,即从“A”到“Z”。你的任务是找出有多少长度等于 's' 的字符串 't',也由大写字母组成,满足以下条件:
- 字符串 't' 在字典上比字符串 's' 大。
- 当你以相反的顺序写's'和't'时,'t'仍然比's'大。
找出这样的字符串 't' 的数量。由于答案可能非常大,取模 10^9 + 7。
解决方案:::
#include <bits/stdc++.h>
using namespace std;
#define m 1000000007
int main() {
// your code goes here
string s;cin>>s;
long long int x=0,ans=0;
int n=s.size();
for(int i=0;i<n; i++){
ans+=((x+1)%m)*('Z'-s[i]);
x= ((26*x)%m)+('Z'-s[i]);
}
cout<<ans%m;
return 0;
}
我无法理解变量的意义x
。
它实际上代表什么?
解决方案
Let D[i]
be 'Z'-s[i]
- 比较大于的可能字符数s[i]
(始终使用从零开始的索引)。
让是长度按字典顺序大于X[i]
的字符串的数量。显然,- 一个空字符串小于任何其他字符串。对于长度大于的字符串,必须满足以下两个条件之一:i
s
X[0] == 0
i+1
s
- 它的前缀长度
i
大于s
,最后一个字符可以是任何字符。有X[i]*26
这样的字符串。 - 它的长度前缀
i
正好等于对应的前缀s
,并且最后一个字符大于s[i]
。有D[i]
这样的字符串。
把这个放在一起,X[i+1] = X[i]*26 + D[i]
。
在程序中,变量x
代表序列——循环迭代开始时X
等于,结束时更新为;在这两种情况下,减少模数以避免溢出。X[i]
X[i+1]
m
现在,这对答案有何贡献?t
考虑一个满足问题陈述中两个条件的字符串。让我们k
成为最后(最右边)的位置,其中t[k] > s[k]
; 对于所有职位z > k
,t[z] == s[z]
. 这个位置k
必须存在,reverse(t) > reverse(s)
才能持有。换句话说,当s
和t
被反向读取时,它们可能有几个(可能为零)共同的字符,后跟一个字符 fromt
大于一个字符 from s
。
进一步地,t
长度的前缀k
必须大于或等于对应的前缀s
,t > s
才能成立。换句话说,当s
和t
被向前读取时,之前的所有字符k
都相等,或者其中有一些较早的字符t
大于s
.
设Y[k]
为 a) 满足问题条件的字符串的数量,并且 b)k
作为最右边的位置t
和s
不同;也就是最右边的位置t[k] > s[k]
。很容易看出这一点Y[k] = (X[k] + 1) * D[k]
。实际上,存在X[k]+1
大于 ( X[k]
) 或等于 ( 1
) 的相应前缀的可能前缀s
。它们中的任何一个都可以跟任何D[k]
大于 的字符,s[k]
然后跟一个与 的对应后缀完全相等的后缀s
。
t
最后,满足问题条件的字符串总数是Y[i]
所有位置的总和i
。
在程序中,变量ans
累加的和Y[i]
,减少的模m
,以避免溢出。
推荐阅读
- trimesh - 为 trimesh 生成网格和光线交点
- android - Android Dialog Fragment RecyclerView 包装内容但基于约束的最大高度?
- ms-access - 如何在 MS Access 中安装 MROUND 功能?
- sql - 从查询创建的表中获取最大的“dauer”条目
- sql - 选择语句从不同的行返回值
- c++ - 为什么 __func__ 是小写,而 __FILE__ 和 __LINE__ 是大写?
- python - 用 np 数组中的列表替换 None 值
- wordpress - 弄乱 Apache 的配置后得到 404“未找到”
- kubernetes - 在 Kubernetes 集群中。主节点是否需要始终在集群节点中单独运行?
- ruby - 如何在Ruby中找到两个字符串中相同子序列的索引?