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 单词连接的更多相关文章

  1. poj1386单词连接(欧拉欧拉欧拉)

    ///单词连接,欧拉回路通路都可以(有向图) ///主要构图:比如possibilities就构造p->s的边////题目大意:给你若干个字符串,一个单词的尾部和一个单词的头部相同那么这两个单词 ...

  2. CoFun 1612 单词分组(容斥)

    Description Stan有N个不同的单词,这天,Stan新结交的两个朋友来他这里玩,Stan作为主人,他需要送给他们单词,但由于Stan不能偏心,所以Stan给每个单词一个权值v_i,他需要他 ...

  3. CSS 类名的单词连字符:下划线还是连接符?

    本文的部分内容整理自我对此问题的解答: 命名 CSS 的类或 ID 时单词间如何连接? - 知乎 问题 CSS 类或 ID 命名时单词间连接通常有这几种写法: 驼峰式: solutionTitle.s ...

  4. [转]CSS 类名的单词连字符:下划线还是横杠?

    问题 CSS 类或 ID 命名时单词间连接通常有这几种写法: 驼峰式: solutionTitle.solutionDetail 用横杠连接: solution-title.solution-deta ...

  5. [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 ...

  6. 蓝桥杯—ALGO-18 单词接龙(DFS)

    问题描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, 要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次) ,在两个单词相连时,其 ...

  7. Luogu-3966 [TJOI2013]单词

    这道题应该是后缀数组的套路题啊,把单词连接起来,中间用没有出现过且互不相同的字符来分隔开,求一下\(height\)数组. 对于一个单词来说,设单词长\(len\),所在的后缀为\(i\),如果某后缀 ...

  8. Leetcode 472.连接词

    连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat" ...

  9. [NOIP2000] 提高组 洛谷P1019 单词接龙

    题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合 ...

随机推荐

  1. 【Xamarin开发IOS-IOS生命周期】

    iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的.在后台时,程序会受 ...

  2. ActiveX,ATL和COM技术

    首先COM的诞生本来就是基于二进制的复用思想,一直影响到了DLL的技术基础.它是一种windows下二进制模块组件与组件之间通信的规范,ActiveX就需要依赖这个技术,因为浏览器的东西可能需要获取客 ...

  3. sqlplus与sqlplusw (转)

    一.sqlplus与sqlplusw两者统称SQLPlus,是Oracle的一个命令行执行工具.   二.SQLPlus的有两种运行方式: 1.在命令行窗口运行.sqlplus 2.在窗口中运行.sq ...

  4. js深入研究之神奇的匿名函数类生成方式

    <script type="text/javascript"> var Book = (function() { // 私有静态属性 ; // 私有静态方法 funct ...

  5. java.lang.ClassNotFoundException错误原因汇总

    开发java很长时间了,还经常会遇到java.lang.ClassNotFoundException这样的错误,最近又处理了一次,起初怀疑是jdk版本比class文件的编译版本低了导致了,但是运维人员 ...

  6. 【剑指offer】面试题36:数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 归并排序的合并过程.主要是考虑合并两个有序序列时,计算逆序 ...

  7. linux内存管理--伙伴系统和内存分配器

    3.1页框的管理 所有的页框描述符都存放在mem_map数组中. 3.1.1page数据结构 struct page { page_flags_t flags; //标志 atomic_t _coun ...

  8. [转载]Linux的时间与时钟中断处理

    本文主要介绍在Linux下的时间实现以及系统如何进行时钟中断处理. 一. Linux的硬件时间 PC机中的时间有三种硬件时钟实现,这三种都是基于晶振产生的方波信号输入.这三种时钟为: 实时时钟RTC ...

  9. hdu 1695 GCD(欧拉函数+容斥)

    Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...

  10. HDOJ 1316 How Many Fibs?

    JAVA大数.... How Many Fibs? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...