CoFun 1613 单词连接
Description
Stan有N个不同的单词,这天,Stan新结交的两个朋友来他这里玩,Stan作为主人,他需要送给他们单词,但由于Stan不能偏心,所以Stan给每个单词一个权值v_i,他需要他这N个单词恰好分配给这两个朋友,这个地方的人很奇怪,他们用来定义自己的喜悦值的方式是把所有得到的单词的权值都位运算and起来的值,所以你需要使得两个朋友的喜悦值是相同的。
好学的Stan不满足于求出一种方案,而是想要知道总共有多少种方案数,Stan觉得这个太简单了,所以请你来帮他解决吧。
Input Format
第一行包含一个整数N
第二行包含N个非负整数,表示每个单词的权值
Output Format
输出仅一行,即方案数
思路:对于每两个字符串,我们考虑A是较小的那个,B是较大的那个,如果AB是回文串,那么BA也一定是回文串。
所以,假如A是B的前缀,那么B中从len(A)+1到len(B)的部分,若为回文串,那么AB和BA就是子串,因此,我们用manacher预处理是否回文,用字典树维护字典,注意要用链表写字典树才不会爆空间。
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
char S[],ss[];
int p[],g[],s[];
int tot,go[],first[],next[],val[],cnt[];
int num[],len[],n;
void manacher(int Len){
int l=;
S[l]='#';
for (int i=;i<=Len;i++)
S[++l]=ss[i],S[++l]='#';
int id=,mx=;p[]=;
for (int i=;i<=l;i++){
if (mx>=i)
p[i]=std::min(mx-i+,p[id*-i]);
else
p[i]=;
while (p[i]+i<=l&&i-p[i]>&&S[p[i]+i]==S[i-p[i]]) p[i]++;
if (i+p[i]->mx) mx=i+p[i]-,id=i;
}
//g[0]=1;
for (int i=;i<Len;i++)
if (p[i]>=i)
g[Len-i]=;
else
g[Len-i]=;
g[Len]=;
}
void insert(int id){
int now=;
manacher(len[id]);
for (int i=;i<=len[id];i++){
int k;
for (k=first[now];k!=;k=next[k])
if (val[k]==s[i]) break;
if (!k){
tot++;
val[tot]=s[i];
next[tot]=first[now];
first[now]=tot;
cnt[tot]=g[i];
now=tot;
}else{
cnt[k]+=g[i];
now=k;
}
}
num[now]++;
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d",&len[i]);
scanf("%s",ss+);
for (int j=;j<=len[i];j++)
s[j]=ss[j];
insert(i);
}
ll ans=;
for (int i=;i<=tot;i++)
ans+=(ll)num[i]*num[i]+(ll)cnt[i]*num[i]*;
printf("%lld\n",ans);
}
CoFun 1613 单词连接的更多相关文章
- poj1386单词连接(欧拉欧拉欧拉)
///单词连接,欧拉回路通路都可以(有向图) ///主要构图:比如possibilities就构造p->s的边////题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词 ...
- CoFun 1612 单词分组(容斥)
Description Stan有N个不同的单词,这天,Stan新结交的两个朋友来他这里玩,Stan作为主人,他需要送给他们单词,但由于Stan不能偏心,所以Stan给每个单词一个权值v_i,他需要他 ...
- CSS 类名的单词连字符:下划线还是连接符?
本文的部分内容整理自我对此问题的解答: 命名 CSS 的类或 ID 时单词间如何连接? - 知乎 问题 CSS 类或 ID 命名时单词间连接通常有这几种写法: 驼峰式: solutionTitle.s ...
- [转]CSS 类名的单词连字符:下划线还是横杠?
问题 CSS 类或 ID 命名时单词间连接通常有这几种写法: 驼峰式: solutionTitle.solutionDetail 用横杠连接: solution-title.solution-deta ...
- [leetcode]30. Substring with Concatenation of All Words由所有单词连成的子串
You are given a string, s, and a list of words, words, that are all of the same length. Find all sta ...
- 蓝桥杯—ALGO-18 单词接龙(DFS)
问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, 要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ,在两个单词相连时,其 ...
- Luogu-3966 [TJOI2013]单词
这道题应该是后缀数组的套路题啊,把单词连接起来,中间用没有出现过且互不相同的字符来分隔开,求一下\(height\)数组. 对于一个单词来说,设单词长\(len\),所在的后缀为\(i\),如果某后缀 ...
- Leetcode 472.连接词
连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...
- [NOIP2000] 提高组 洛谷P1019 单词接龙
题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...
随机推荐
- android 无法生成R文件的原因剖析
android 无法生成R文件 是件痛苦的事情,即使有时候你xml文件没有错误,他都无法生成.针对此问题,我总结以下几个方面的原因. 一.xml本身有错误 R.java这个文件是会自动生成的,但是如果 ...
- Linux企业级项目实践之网络爬虫(2)——网络爬虫的结构与工作流程
网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份. 一个通用的网络爬虫的框架如图所示:
- Polymorphism & Overloading & Overriding
In Java, a method signature is the method name and the number and type of its parameters. Return typ ...
- Android 体系结构
Anroid是在Linux基础开发出的一个移动设备开发平台.它自上而下包含四个部分: Application(应用程序) Applicaton Framework(应用程序框架) Libraries& ...
- [Javascript] Call Stack
Every time when a function run it will be push into the call stack and put on the top, you can thin ...
- spring 通过工厂方法配置Bean
概要: 通过调用静态工厂方法创建Bean 调用静态工厂方法创建Bean是将对象创建的过程封装到静态方法中.当client须要对象时,仅仅须要简单地调用静态方法,而不用关心创建对象地细节. 要声明通过静 ...
- android避免service被杀
1.在service中重写下面的方法,这个方法有三个返回值, START_STICKY是service被kill掉后自动重写创建@Override public int onStartComma ...
- java基础之集合
集合的定义,集合的应用,集合的分类,集合的遍历,集合的特性
- 后台写js 并跳转
Response.Write("<script>alert('成功');location.replace('ApplyClass.aspx')</script>&qu ...
- SQL Server 向临时表插入数据
INSERT INTO #DirtyOldWIPBOM SELECT TOP (100) PERCENT dbo.WIP_BOM.Model, dbo.WIP_BOM.PartNumber,WIP_B ...