神仙题++

还是在某校梁大讲的题qaq

我们考虑容斥

也就是本质不同字串=全部-重复的

我们只需要求重复的即可

考虑相同的s=ab 我们用长度最长的a作为代表串

如果存在一个a'b'且|a'|>|a| 分析可以知道必然有b'是b的border 如图

那么显然我们存在b的最长border b''使a''b''=ab

这个可以kmp求得f[i]为border

然后我们在考虑b的一段前缀在a中出现的次数

那么我们可以通过exkmp求得g[i]表示以i开头的最长长度 然后接下来反向前缀和更新即可

一个方便的做法是把s串和t串拼到一起然后做exkmp

还有一个小bug就是memcpy的时候sizeof是一整个数组...不能写一个位置...调了我一上午QAQ

代码参考了bestfy学姐的 非常简洁qwq

//Love and Freedom.
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 20021225
#define N 200005
using namespace std; char ch[N],s[N],t[N];
int f[N],g[N],ans[N];
void kmp(int n)
{
for(int i=;i<=n;i++)
{
f[i]=f[i-];
while(f[i]&&ch[f[i]+]!=ch[i]) f[i]=f[f[i]];
f[i]=(ch[f[i]+]==ch[i]?f[i]+:f[i]);
}
}
void exkmp(int n)
{
int ms=;
for(int i=;i<=n;i++)
{
g[i]=max(,min(g[i-ms+],ms+g[ms]-i));
while(i+g[i]<=n&&ch[i+g[i]]==ch[+g[i]]) g[i]++;
if(i+g[i]>ms+g[ms]) ms=i;
}
g[]=n;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%s%s",t+,s+); int n=strlen(s+);
memcpy(ch+,s+,sizeof(char)*(n+)); kmp(n);
int ls=n,lt=strlen(t+);// printf("%s",ch+1);
ch[++n]='*'; for(int i=;i<=lt;i++) ch[++n]=t[i];
exkmp(n);
for(int i=ls+;i<=n;i++) ans[g[i]]++;
for(int i=ls;i>=;i--) ans[i]+=ans[i+];
ll fin=1ll*lt*ls;
for(int i=;i<=ls;i++) if(f[i]) fin-=ans[i-f[i]];
printf("%I64d\n",fin);
return ;
}

CF1090J Two Prefixes的更多相关文章

  1. POJ2001Shortest Prefixes[Trie]

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 17683   Accepted: 768 ...

  2. POJ2001 Shortest Prefixes

    Description A prefix of a string is a substring starting at the beginning of the given string. The p ...

  3. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  4. POJ 2001:Shortest Prefixes

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 16782   Accepted: 728 ...

  5. OpenJudge/Poj 2001 Shortest Prefixes

    1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...

  6. poj 2001 Shortest Prefixes trie入门

    Shortest Prefixes 题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20:之后输出每个字符串可以简写的最短前缀串: Sample Input carbohydrate ...

  7. codeforces432D Prefixes and Suffixes(kmp+dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a strin ...

  8. Shortest Prefixes(trie树唯一标识)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 15948   Accepted: 688 ...

  9. Codeforces 432D Prefixes and Suffixes(KMP+dp)

    题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...

随机推荐

  1. 基于python实现自动化办公学习笔记二

    word文件(1)读word文件 import win32comimport win32com.client def readWordFile(path): # 调用系统word功能,可以处理doc和 ...

  2. clojure 语法

    Clojure 是一种运行在 Java 平台上的 LISP 方言,LISP 是一种以表达性和功能强大著称的编程语言. ; 分号作为注释的开始 ; clojure 用括号把元素括起来,元素之间用空格隔开 ...

  3. 【洛谷P4445 【AHOI2018初中组】报名签到】

    题目描述 n 位同学(编号从1 到n)同时来到体育馆报名签到,领取准考证和参赛资料.为了有序报名,这n 位同学需要按编号次序(编号为1 的同学站在最前面)从前往后排成一条直线.然而每一位同学都不喜欢拥 ...

  4. (转)Jquery之ShowLoading遮罩组件

    本文转载自:http://www.cnblogs.com/eczhou/archive/2012/12/18/2822788.html 一.遮罩用途及效果 ShowLoading这个jQuery插件设 ...

  5. vim推荐的光标移动配置文件?

    http://roclinux.cn/?p=1466 inoremap jk inoremap ... 参考较好的vim设置文件 : 共享粘贴板: set clipboard+=unnamed 除了映 ...

  6. 设置bios加快系统的启动

    设置bios加快系统的启动 bois的设置错误, 还会引起系统的工作不正常 bios设置正确合理, 关系到系统的高效运行: 一般, 应该将bios中, 系统的各个cache 缓存开启,如cpu缓存, ...

  7. Celery多任务结构

    视图结构 pro_cel ├── celery_task# celery相关文件夹 │ ├── celery.py # celery连接和配置相关文件,必须叫这个名字 │ └── tasks1.py ...

  8. unigui 服务器 是否显示 程序窗口

    unigui 服务器 是否显示 程序窗口 servermodule 窗体的这个standaloneserver属性 为false 时 显示窗体. 为true 时 不显示窗体. 哈哈  

  9. 整理那些用于基本生存的shell命令

    变量定义相关的 export export可以将临时定义的变量定义成环境变量 比如在一个shell中临时定义的一个变量就没法在新打开的那个shell中继续再使用 使用export之后 这个变量就变成了 ...

  10. Mac入门--通过Homebrew安装PHP(新)

    1 首先安装homebrew,安装过的话更新 安装:homebrew官网地址:https://brew.sh/index_zh-cn.html.或者直接复制下面代码: /usr/bin/ruby -e ...