【JZOJ4812】string
来源:互联网 发布:淘宝仓管的工作 编辑:程序博客网 时间:2024/05/20 07:58
Description
给出一个长度为n, 由小写英文字母组成的字符串S, 求在所有由小写英文字母组成且长度为n 且恰好有k 位与S 不同的字符串中,给定字符串T 按照字典序排在第几位。
由于答案可能很大,模10^9 + 7 输出。
Solution
转化题目,我们要求的就是字典序比T小且恰有k位和S不同的字符串个数。
我们假设当前做到第
如果
如果
然后对于
Code
#include<iostream>#include<cstdio>#include<cstdlib>#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)#define N 100010#define mo 1000000007#define ll long longusing namespace std;char s[N],t[N];int a[N],b[N];ll mi[N],jc[N],ny[N];ll pow(ll m,int n){ ll b=1; while(n) { if(n%2) b=b*m%mo; n/=2; m=m*m%mo; } return b;}ll c(int m,int n){ return jc[m]*ny[m-n]%mo*ny[n]%mo;}int main(){ freopen("string.in","r",stdin); freopen("string.out","w",stdout); int n,k; cin>>n>>k; scanf("%s",s+1); scanf("%s",t+1); jc[0]=mi[0]=ny[0]=1; fo(i,1,n) { a[i]=s[i]-'a'; b[i]=t[i]-'a'; jc[i]=jc[i-1]*i%mo; ny[i]=pow(jc[i],mo-2); mi[i]=mi[i-1]*25%mo; } ll ans=1; fo(i,1,n) if(a[i]==b[i]) ans=(ans+b[i]*mi[k-1]%mo*c(n-i,k-1)%mo)%mo; else { if(a[i]<b[i]) { ans=(ans+(b[i]-1)*mi[k-1]%mo*c(n-i,k-1)%mo)%mo; if(k<=n-i) ans=(ans+c(n-i,k)%mo*mi[k]%mo)%mo; } else ans=(ans+b[i]*mi[k-1]%mo*c(n-i,k-1)%mo)%mo; k--; } cout<<ans;}
1 0
- 【JZOJ4812】string
- NOIP提高组【JZOJ4812】string
- 【JZOJ4812】【NOIP2016提高A组五校联考2】string
- string
- String
- String
- string
- string
- String
- string
- String
- string
- string
- string
- string
- String
- String
- string
- C#和C++结构体Socket通信
- 利用栈将十进制转换为二进制
- listview的监听事件
- <21天实战caffe>第8章程序编译问题
- 数据结构的链式存储结构
- 【JZOJ4812】string
- 【NOIP2016提高A组五校联考2】string
- 设计模式-工厂方法设计模式
- HDU-5914 Triangle(思路)
- mybatis笔记
- Android 通知栏信息
- 人品问题
- KWIC问题:tokenizer/arraylist in java
- LeetCode oj 260. Single Number III (位运算)