/*
不会做
f[i][j] = f[i][j]* 26 + 25^(j-i)*C(i-1)(j-1)
C(i-1)(j-1) 对应j-1最早出现的位置
1、答案只和字符串长度有关。
2、最多不同的字符串长度只有(k+1)*k/2 = sum , k = sqrt(2*sum)
代码参考 @ftiasch大神的
*/
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<vector>
using namespace std;
typedef long long lld;
const int maxn = 100005;
const int mod = (int)1e9+7;
char ch[maxn];
int fact[maxn];
int a25[maxn];
int inv[maxn];
int q[maxn],t[maxn];
int n , m;
int pow(int x, int n){
int ret = 1 ;
while(n){
if(n&1) ret = (lld)ret*x%mod;
x = (lld)x*x%mod;
n >>=1;
}
return ret;
}
void init(){
fact[0] = a25[0] = inv[0] = 1;
for(int i = 1 ; i < maxn ; i ++){
fact[i] = (lld)fact[i-1]*i%mod;
a25[i] = (lld)a25[i - 1] * 25 %mod;
inv[i] = pow(fact[i],mod - 2);
}
}
vector<int> gao(int x){
vector<int>ret(maxn , 0);
ret[x] = 1;
for(int i = x + 1; i < maxn ; i ++){
ret[i] =(lld) ret[i - 1]*26%mod+(lld)a25[i-x]*fact[i-1]%mod*inv[x-1]%mod*inv[i-x]%mod;
ret[i] %= mod;
}
return ret ;
}
int main(){
int i , j , tp , l;
init();
//puts("done");
scanf("%d",&m);
vector<int> values;
scanf("%s",ch);
int ll = strlen(ch);
values.push_back(ll);
for(i = 0 ; i < m ; i ++){
scanf("%d",&t[i]);
if(t[i] == 1){
scanf("%s",ch);
l = strlen(ch);
q[i] = l;
values.push_back(l);
}else{
scanf("%d",&q[i]);
}
}
sort(values.begin(),values.end());
values.erase(unique(values.begin(),values.end()),values.end());
vector< vector<int> > solve;
for(i = 0 ; i < values.size(); i ++){
solve.push_back(gao(values[i]));
}
int cur = ll;
for(i = 0; i < m ; i ++){
if(t[i] == 1){
cur = q[i];
}else{
int idx = lower_bound(values.begin(),values.end(), cur) - values.begin();
printf("%d\n",solve[idx][q[i]]);
}
}
return 0;
}
Codeword codeforces 666c
最新推荐文章于 2023-05-05 10:51:29 发布