CF1090J Two Prefixes
神仙题++
还是在某校梁大讲的题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的更多相关文章
- POJ2001Shortest Prefixes[Trie]
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 17683 Accepted: 768 ...
- POJ2001 Shortest Prefixes
Description A prefix of a string is a substring starting at the beginning of the given string. The p ...
- poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12731 Accepted: 544 ...
- POJ 2001:Shortest Prefixes
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16782 Accepted: 728 ...
- OpenJudge/Poj 2001 Shortest Prefixes
1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...
- poj 2001 Shortest Prefixes trie入门
Shortest Prefixes 题意:输入不超过1000个字符串,每个字符串为小写字母,长度不超过20:之后输出每个字符串可以简写的最短前缀串: Sample Input carbohydrate ...
- codeforces432D Prefixes and Suffixes(kmp+dp)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Prefixes and Suffixes You have a strin ...
- Shortest Prefixes(trie树唯一标识)
Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15948 Accepted: 688 ...
- Codeforces 432D Prefixes and Suffixes(KMP+dp)
题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出 ...
随机推荐
- 模拟赛DAY 2 T2不老梦
[题目背景] 于万人中万幸得以相逢,刹那间澈净明通. 成为我所向披靡的勇气和惶恐,裂山海,堕苍穹. 爱若执炬迎风,炽烈而哀恸,诸般滋味皆在其中. 韶华宛转吟诵,苍凉的光荣,急景凋年深情难共. ——银临 ...
- 使用GOGS搭建自己的Git托管
大家在开发中一般使用的git服务都是公司搭建好的,或者就是直接用gayhub提供的免费的仓库 如果想搭建一个自己的仓库的话怎么弄,这里给大家安利一款开箱即用的git托管服务:gogs. gogs是基于 ...
- 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be
当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...
- linux下升级php5.4到php5.6
进入终端后查看php版本 php -v 输出可能如下: PHP 5.4.35 (cli) (built: Nov 14 2014 07:04:10) Copyright (c) 1997-2014 T ...
- if you don't go after what you want, you'll never have it
conquest.n. 征服 quantitative: adj. 数量的 cellar: n. 地窖 roast. v. 烧烤 allowance. n. 津贴 drainage. n. 排水 ma ...
- 如何理解ajax的同步和异步?
对于如下一段代码: var dataJson = {"ABC":'testABC'}; $.ajax({ url: "/MonkeyServ ...
- oracle--表空间处理
CREATE TABLESPACE命令详解(转) 表空间理解 https://www.cnblogs.com/kerrycode/p/3418694.html 常用操作 https://www.cnb ...
- oracle--对象权限
sys用户查询ww用户创建的表(已经commited) select * from ww.wwTable; 普通用户lisi查询ww用户的表 grant select on wwTable to li ...
- 数据映射-LSM Tree和SSTable
Coming from http://blog.sina.com.cn/s/blog_693f08470101njc7.html 今天来聊聊lsm tree,它的全称是log structured m ...
- Forbidden (CSRF token missing or incorrect.):错误解决办法
在JS中,使用post方法提交数据到后台,出现错误: Forbidden (CSRF token missing or incorrect.):.........; 解决办法: 在页面导入JS的位置, ...