CF 1466G Song of the Sirens
CF 1466G Song of the Sirens
鸽了这么久,寒假集训强行水一波博客
xx.size()返回的是一个无类型,不能相减,定了天赋值到int上面warning一下,但是!!!一定不能做运算,不然就报RE,运算前一定要强制类型转换 调一年
#include
using namespace std;
const int N=1e6+5;
const long long mod=1e9+7;
int n,Q,k;
string t,w,temp;
long long p[N],two[N],f[27][N];
vector s(1);
void get_kmp_init(string b)
{
int lb=b.size();
p[0]=0;
for(int i=1,j=0;i0 && b[i]!=b[j]) j=p[j-1];
if(b[i]==b[j]) j++;
p[i]=j;
}
return ;
}
int kmp(string a, string b)
{
//计算a中多少个b
int sum=0,la=a.size(),lb=b.size();
for(int i=0,j=0;i0 && a[i]!=b[j])
j=p[j-1];
if(a[i]==b[j])
j++;
if(j==lb)
{
sum++;
j=p[j-1];
}
}
return sum;
}
long long pow3(long long x,long long y)
{
long long tempans=1;
while(y)
{
if(y%2!=0)
tempans=tempans*x%mod;
x=x*x%mod;
y>>=1;
}
return tempans;
}
int main()
{
cin>>n>>Q;
cin>>s[0]>>t;
two[0]=1;
for(int i=1;i<=n;i++)
two[i]=two[i-1]*2%mod;
for(int i=1;s[i-1].size()<1e6+3&&i>k>>w;
get_kmp_init(w);
long long ans=0;
bool flag=0;
for(int j=0;j<=k;j++)
{
if(j>0&&s[j-1].size()+1>=w.size())
{
//可以计算第二部分贡献时,枚举所有字母(去重后t中的字母也行)
for(int l=0;l<26;l++)
{
temp=s[j-1].substr(s[j-1].size()-w.size()+1)+(char)('a'+l)+s[j-1].substr(0,w.size()-1);
// cout<=w.size()&&flag==0)
{
// 第一次s.size()>w 计算第一部分贡献
ans+=two[k-j]*kmp(s[j],w)%mod;
flag=1;
}
}
printf("%lld\n",(ans%mod+mod)%mod);
}
return 0;
}
/*
4 5
aba
bbac
3
3 3
aa
bcd
2 aba
3 ca
3 aa
*/