枚举T中失配的位置i,容易发现能够成立当且仅当存在一个以$T[0,i)$为后缀的前缀$S[0,a)$且$T(i,|T|)$是$S(a,|S|)$的一个前缀
考虑建立S的正序和倒序的两个后缀自动机,设$T[0,i)$对应点x(正序自动机中),$T(i,|T|)$对应点y(倒序自动机中),那么必然有$a-1\in right(x)$和$a+1\in right(y)$,具体地,如果将每一个前缀连向空一个字符的后缀,那么当且仅当两者的present子树中存在一条边
然后有一个小问题,当$T[i]=S[a]$的时是不需要累计答案的,由于每一个位置分割都满足存在,所以要减去$出现次数|T|\cdot 出现次数$
如果把边看成$(x,y)$的点(按照dfs序),那么相当于二维数点的问题,用差分离线+线段树即可,时间复杂度$o(26|S|+log_{|S|}\sum {|T|})$,常数较大

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1000005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 struct sam{
8 int V,s[N],len[N],nex[N],ch[N][31],id[N],dfn[N],sz[N];
9 vector<int>v[N];
10 }S[2];
11 struct qu{
12 int p,id,x,y;
13 };
14 vector<int>v[N];
15 vector<qu>Q[N];
16 int n,las,pre[N],lst[N],ans[N],f[N<<2];
17 char s[N];
18 void add(int t,int c,int x){
19 int p=las,np=las=S[t].id[x]=++S[t].V;
20 S[t].s[np]=1;
21 S[t].len[np]=S[t].len[p]+1;
22 while ((p)&&(!S[t].ch[p][c])){
23 S[t].ch[p][c]=np;
24 p=S[t].nex[p];
25 }
26 if (!p)S[t].nex[np]=1;
27 else{
28 int q=S[t].ch[p][c];
29 if (S[t].len[q]==S[t].len[p]+1)S[t].nex[np]=q;
30 else{
31 int nq=++S[t].V;
32 S[t].nex[nq]=S[t].nex[q];
33 S[t].len[nq]=S[t].len[p]+1;
34 memcpy(S[t].ch[nq],S[t].ch[q],sizeof(S[t].ch[q]));
35 S[t].nex[q]=S[t].nex[np]=nq;
36 while ((p)&&(S[t].ch[p][c]==q)){
37 S[t].ch[p][c]=nq;
38 p=S[t].nex[p];
39 }
40 }
41 }
42 }
43 void dfs(int p,int k){
44 S[p].sz[k]=1;
45 S[p].dfn[k]=++las;
46 for(int i=0;i<S[p].v[k].size();i++){
47 dfs(p,S[p].v[k][i]);
48 S[p].s[k]+=S[p].s[S[p].v[k][i]];
49 S[p].sz[k]+=S[p].sz[S[p].v[k][i]];
50 }
51 }
52 void update(int k,int l,int r,int x){
53 f[k]++;
54 if (l==r)return;
55 if (x<=mid)update(L,l,mid,x);
56 else update(R,mid+1,r,x);
57 }
58 int query(int k,int l,int r,int x,int y){
59 if ((l>y)||(x>r))return 0;
60 if ((x<=l)&&(r<=y))return f[k];
61 return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
62 }
63 int main(){
64 scanf("%s%d",s,&n);
65 int l=strlen(s);
66 las=S[0].V=S[1].V=S[0].id[0]=S[1].id[l]=1;
67 for(int i=0;i<l;i++)add(0,s[i]-'a',i+1);
68 las=1;
69 for(int i=l-1;i>=0;i--)add(1,s[i]-'a',i);
70 for(int i=1;i<=S[0].V;i++)S[0].v[S[0].nex[i]].push_back(i);
71 las=0;
72 dfs(0,1);
73 for(int i=1;i<=S[1].V;i++)S[1].v[S[1].nex[i]].push_back(i);
74 las=0;
75 dfs(1,1);
76 for(int i=1;i<=n;i++){
77 scanf("%s",s);
78 int ll=strlen(s);
79 memset(pre,0,sizeof(pre));
80 memset(lst,0,sizeof(lst));
81 pre[0]=lst[ll]=1;
82 for(int j=0;j<ll;j++)
83 if (!S[0].ch[pre[j]][s[j]-'a'])break;
84 else pre[j+1]=S[0].ch[pre[j]][s[j]-'a'];
85 for(int j=ll-1;j>=0;j--)
86 if (!S[1].ch[lst[j+1]][s[j]-'a'])break;
87 else lst[j]=S[1].ch[lst[j+1]][s[j]-'a'];
88 if (pre[ll])ans[i]-=ll*S[0].s[pre[ll]];
89 for(int j=0;j<ll;j++)
90 if ((pre[j])&&(lst[j+1])){
91 Q[S[0].dfn[pre[j]]-1].push_back(qu{-1,i,S[1].dfn[lst[j+1]],S[1].dfn[lst[j+1]]+S[1].sz[lst[j+1]]-1});
92 Q[S[0].dfn[pre[j]]+S[0].sz[pre[j]]-1].push_back(qu{1,i,S[1].dfn[lst[j+1]],S[1].dfn[lst[j+1]]+S[1].sz[lst[j+1]]-1});
93 }
94 }
95 for(int i=0;i<l;i++)v[S[0].dfn[S[0].id[i]]].push_back(S[1].dfn[S[1].id[i+1]]);
96 for(int i=1,j=0;i<=S[0].V;i++){
97 for(int j=0;j<v[i].size();j++)update(1,1,S[1].V,v[i][j]);
98 for(int j=0;j<Q[i].size();j++)ans[Q[i][j].id]+=Q[i][j].p*query(1,1,S[1].V,Q[i][j].x,Q[i][j].y);
99 }
100 for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
101 }

[noi1754]SA的更多相关文章

  1. QL Server 2008 所有账号丢失sysadmin权限,sa账号亦没有开启,该如何解决??

    1. 用Run as a administrator打开命令提示符里输入NET STOP MSSQLSERVER, 即停止MSSQLSERVER运行. 2. 在命令提示符里输入 NET START M ...

  2. 没有了SA密码,无法Windows集成身份登录,DBA怎么办?

    一同事反馈SQL无法正常登录了,以前都是通过windows集成身份验证登录进去的(sa密码早忘记了),今天就改了服务器的机器名,现在无论如何都登录不进去. SQL登录时如果采用windows集成身份验 ...

  3. SqlServer windowss身份登陆和sa身份登陆

    今天重新装了系统,但是计算机名变了,于是修改了计算机名,然后装了SQLSEVER,安装完成后登录,发现无论用WINDOWS身份还是SQLSERVER身份都登录不了 1.先说说sqlserver身份登录 ...

  4. 【JBOSS】User not found SA

    启动JBOSS 发现报User not found: SA 错误, 找了老半天才找到处理方法,异常日志如下: java.sql.SQLException: User not found: SA at ...

  5. Cannot set a credential for principal 'sa'. (Microsoft SQL Server,错误: 15535)

    在SQL SERVER 2008上上禁用sa登录时,遇到下面错误:"Cannot set a credential for principal 'sa'. (Microsoft SQL Se ...

  6. ASP.NET连接数据库时,提示“用户 'sa' 登录失败原因: 未与信任 SQL Server 连接相关联

    用ASP.NET连接数据库时,提示"用户 'sa' 登录失败.原因: 未与信任 SQL Server 连接相关联.".解决方法:首先检查是不是web.config文件内的用户名密码 ...

  7. Sa yo na ra

    总想记点些什么. 都快忘了当初是为什么来到这里呢... 2014年10月,友人给我介绍了一门编程竞赛ACM,并给我演示了一下A+B.于是我知道了ACM的含义. 2014年12月,开始水入门题. 201 ...

  8. SQL_Server_2008修改sa密码的方法

    转载自:http://blog.csdn.net/templar1000/article/details/20211191 1. 先用Window身份验证方式登陆进去,选择数据库实例,右键选择属性—— ...

  9. 高级Linux SA需要会做的事情

    高级Linux SA需要会做的事情:linux---------系统安装(光盘或自动化安装)linux---------系统常用工具安装(sudo,ntp,yum,rsync,lrzsz syssta ...

随机推荐

  1. Java读取属性配置文件-properties

    在项目开发中,我们难免将一些可变的参数放在程序以外,作为一个单独的文件,即配置文件,这样方便项目在不同的使用环境部署时.或者说需要不同时,可以通过简单配置这些程序以外的文件来修改程序里的变量. 常用的 ...

  2. HttpServletRequest 入门

    1. request对象和response对象的原理 request和response对象是由服务器创建的.我们来使用它们 request对象是来获取请求消息,response对象是来设置响应消息 2 ...

  3. Spring启动过程源码分析基本概念

    Spring启动过程源码分析基本概念 本文是通过AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程. 在看源码之前,我们要知道某些类的 ...

  4. Golang通脉之切片

    因为数组的长度是固定的并且数组长度属于类型的一部分,所以数组有很多的局限性. func arraySum(x [3]int) int{ sum := 0 for _, v := range x{ su ...

  5. 12. 亿级流量电商系统JVM模型参数二次优化

    亿级流量电商系统JVM模型参数预估方案,在原来的基础上采用ParNew+CMS垃圾收集器 一.亿级流量分析及jvm参数设置 1. 需求分析 大促在即,拥有亿级流量的电商平台开发了一个订单系统,我们应该 ...

  6. 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树

    解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...

  7. Java:ConcurrentHashMap类小记-3(JDK8)

    Java:ConcurrentHashMap类小记-3(JDK8) 结构说明 // 所有数据都存在table中, 只有当第一次插入时才会被加载,扩容时总是以2的倍数进行 transient volat ...

  8. window系统上实现mongodb副本集的搭建

    一.问题引出 假设我们生产上的mongodb是单实例在跑,如果此时发生网络发生问题或服务器上的硬盘发生了损坏,那么这个时候我们的mongodb就使用不了.此时我们就需要我们的mongodb实现高可用, ...

  9. 2021.10.27考试总结[冲刺NOIP模拟17]

    T1 宝藏 发现每个数成为中位数的长度是关于权值单调的.线段树二分判断是否合法,单调指针扫即可. 考场上写了二分,平添\(\log\). \(code:\) T1 #include<bits/s ...

  10. 看动画学算法之:双向队列dequeue

    目录 简介 双向队列的实现 双向队列的数组实现 双向队列的动态数组实现 双向队列的链表实现 双向链表的时间复杂度 简介 dequeue指的是双向队列,可以分别从队列的头部插入和获取数据,也可以从队列的 ...