String Mark Codeforces - 895D
一看好像会做的样子,就去做了一下,结果
猝不及防地T掉了
赶紧查了一下,没有死循环,复杂度也是对的,无果,于是翻了题解
题解没看懂,但是找到了标程,然后发现我被卡常了。。。
而且好像当时还过了前10个点啊。。这要真的是比赛稳稳的FST啊
小技巧:
逆元只需要求inv[i]和inv[i!],可以预处理出来
令md=1e9+7
则inv[1]=1
除此外inv[i]=(md-md/i)*inv[md%i]%md
令inv2[i]=inv[i!]
则inv2[n]=pow(n!,md-2)
除此外inv2[i]=inv2[i+1]*(i+1)%mod;
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=;
while(b)
{
if(b&) ans=(ans*base)%md;
b>>=;
base=(base*base)%md;
}
return ans;
}
LL inv[],inv2[],jc[],sum,sumx,num[],ans,n;
char s1[],s2[];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;#include
#include
#include
#include
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=1;
while(b)
{
if(b&1) ans=(ans*base)%md;
b>>=1;
base=(base*base)%md;
}
return ans;
}
LL inv[1000100],inv2[1000100],jc[1000100],sum,sumx,num[30],ans,n;
char s1[1000100],s2[1000100];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;
sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+1);
scanf("%s",s2+1);n=strlen(s2+1);
jc[0]=1;
for(i=1;i<=1000000;i++) jc[i]=jc[i-1]*i%md;
inv[1]=1;
for(i=2;i<=1000000;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=0;i<=1000000;i++) inv2[i]=poww(jc[i],md-2);
for(i=1;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=0;i<26;i++) sum=sum*inv2[num[i]]%md;
for(i=1;i<=n;i++)
{
for(j=0;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=0;i<26;i++) num[i]=0;
for(i=1;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=0;i<26;i++) sum=sum*inv2[num[i]]%md;
for(i=1;i<=n;i++)
{
for(j=0;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-1+md)%md;
printf("%lld",ans);
return 0;
} sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+);
scanf("%s",s2+);n=strlen(s2+);
jc[]=;
for(i=;i<=;i++) jc[i]=jc[i-]*i%md;
inv[]=;
for(i=;i<=;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=;i<=;i++) inv2[i]=poww(jc[i],md-);
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=;i<;i++) num[i]=;
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-+md)%md;
printf("%lld",ans);
return ;
}
原来的代码(假的)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#define md 1000000007
using namespace std;
typedef long long LL;
LL poww(LL a,LL b)
{
LL base=a,ans=;
while(b)
{
if(b&) ans=(ans*base)%md;
b>>=;
base=(base*base)%md;
}
return ans;
}
LL inv[],inv2[],jc[],sum,sumx,num[],ans,n;
char s1[],s2[];
void addx(LL x)
//num[x]++,同时维护sum,sumx
{
sum=sum*jc[num[x]]%md;
num[x]++;sumx++;
sum=sum*sumx%md;
sum=sum*inv2[num[x]]%md;
}
void delx(LL x)
{
sum=sum*jc[num[x]]%md;
sum=sum*inv[sumx]%md;
sumx--;num[x]--;
sum=sum*inv2[num[x]]%md;
}
//s1的所有排列中小于s2的个数-s1的所有排列中小于s1的个数+1
int main()
{
LL i,j;
scanf("%s",s1+);
scanf("%s",s2+);n=strlen(s2+);
jc[]=;
for(i=;i<=;i++) jc[i]=jc[i-]*i%md;
inv[]=;
for(i=;i<=;i++) inv[i]=(md-md/i)*inv[md%i]%md;
for(i=;i<=;i++) inv2[i]=poww(jc[i],md-);
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s2[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans+sum)%md;
addx(j);
}
if(num[s2[i]-'a']) delx(s2[i]-'a');
else break;
}
for(i=;i<;i++) num[i]=;
for(i=;i<=n;i++) num[s1[i]-'a']++;
sum=jc[n];sumx=n;
for(i=;i<;i++) sum=sum*inv2[num[i]]%md;
for(i=;i<=n;i++)
{
for(j=;j<s1[i]-'a';j++)
if(num[j])
{
delx(j);
ans=(ans-sum+md)%md;
addx(j);
}
if(num[s1[i]-'a']) delx(s1[i]-'a');
else break;
}
ans=(ans-+md)%md;
printf("%lld",ans);
return ;
}
String Mark Codeforces - 895D的更多相关文章
- Codeforces 895.D String Mark
D. String Mark time limit per test 4 seconds memory limit per test 256 megabytes input standard inpu ...
- String Typing CodeForces - 954B
题意: 给一个字符串,可以复制某一段字符,问最少需要多少步能将其输出,比如abcabcd,先输入abc然后再赋值abc再输入d就只需要5步. 复制的这段字符 必须是从字符串的0位置开始复制的 而且只 ...
- Vasya and Binary String(来自codeforces
题目大意: 给定一个0/1字符串,每次你可以将此字符串中一段连续的任意长度的0/1子串消除掉,注意每次消除的子串中只能有0或者1一种字符,消除掉一串长度为i的0/1字符串会得到a[i]的收益,问将这个 ...
- Playing with String(codeforces 305E)
题意:刚开始你只有一个字符串每次能选择一个有的字符串 s,找到 i,满足s[i - 1] = s[i + 1],将其分裂成 3 个字符串s[1 · · · i - 1]; s[i]; s[i + 1 ...
- Codeforces #402
目录 Codeforces #402 Codeforces #402 Codeforces 779A Pupils Redistribution 链接:http://codeforces.com/co ...
- Codeforces Round #300 A. Cutting Banner 水题
A. Cutting Banner Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/538/pro ...
- Codeforces Round #448
Pizza Serparation #include<stdio.h> #include<string.h> #include<stdlib.h> #include ...
- CodeForces - 999B Reversing Encryption
B - Reversing Encryption A string s of length n can be encrypted by the following algorithm: iterate ...
- c++ hex string array 转换 串口常用
c++ hex string array 转换 效果如下 tset string is follow 0x50 55 0x35 00 10 203040506073031323334ff format ...
随机推荐
- CTEX - 在线文档 - TeX/LaTeX 常用宏包
CTEX - 在线文档 - TeX/LaTeX 常用宏包 页面与章节标题式样 浮动对象及标题设计 生成与插入图形 表格与列表 目录与索引 参考文献 数学与化学公式 ...
- 【深度探索c++对象模型】Function语义学之成员函数调用方式
非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...
- python绘图入门
python绘图入门 学习了:https://zhuanlan.zhihu.com/p/34200452 API:https://matplotlib.org/api/pyplot_api.html ...
- Linux中查看文件或者文件夹大小
df -l 查看磁盘空间大小命令 df -hl 查看磁盘剩余空间 df -h 查看每个根路径的分区大小 du -sh 当前文件夹下所有文件大小(包括子文件大小 du -sm [文件夹] 返回该 ...
- 机器学习技法总结(五)Adaptive Boosting, AdaBoost-Stump,决策树
上一讲主要利用不同模型计算出来的g.採用aggregation来实现更好的g.假设还没有做出来g.我们能够採用bootstrap的方法来做出一系列的"diversity"的data ...
- Linux —— 压缩文件
Linux——压缩文件 为什么需要压缩文件? 文件在传输过程中,可能由于文件过大,传输所需时间过多.减少文件大小有两个明显的好处,一是可以减 少存储空间,二是通过网络传输文件时,可以减少传 ...
- 嵌入式开发之davinci---DM8168 8127 8148 HDVPSS中的一些英文缩写解释
BLEND:Alpha blends input with the graphics.将输入的视频与图形做Alpha融合. CPROC:Color Processing.颜色处理.如动态对比度增强.饱 ...
- Selenium 工具介绍、安装、配置及使用
概念 selenium是一款跨平台开源工具,用于web的功能完整性測试,想做压力測试的能够换软件了 先看一眼官方站 http://docs.seleniumhq.org/download/ 首先要FQ ...
- 在windows cgywinportable上,通过运行linux命令,批量改动文件名。
在windows cgywinportable上.通过运行linux命令.批量改动文件名. 实例:将当前文件夹下的全部文件名称加上.sql find ./ -type f -exec mv {} ' ...
- ios开发--NSDate与NSDateFormatter的相关用法【转】
原文地址:http://blog.sina.com.cn/s/blog_91ff71c0010188u9.html 1.NSDateFormatter配合NSDate与NSString之间的转化 N ...