BZOJ1524: [POI2006]Pal

1524: [POI2006]Pal

Time Limit: 5 Sec  Memory Limit: 357 MB
Submit: 308  Solved: 101
[Submit][Status]

Description

给出n个回文串s1, s2, …, sn
求如下二元组(i, j)的个数
si + sj 仍然是回文串

规模
输入串总长不超过2M bytes

Input

The first line of input file
contains the number of strings n. The following n lines describe each
string:
The i+1-th line contains the length of the i-th string li, then a single
space and a string of li small letters of English alphabet.

You can assume that the total length of all strings will not exceed
2,000,000. Two strings in different line may be the same.

Output

Print out only one integer, the number of palindromes

Sample Input

6
2 aa
3 aba
3 aaa
6 abaaba
5 aaaaa
4 abba

Sample Output

14

HINT

Source

题解:
说一下做这题的艰辛过程。。。
刚开始看见题画了画图发现好像短串必须是长串的前缀,然后就开开心心的打程序,然后就WA了。。。发现 a 和 aba  显然不能构成回文串。。。
然后又想  发现短串好像需要不重叠覆盖长串,然后又开始写程序,然后又开始WA,后来发现 aa 和 aaa 能构成回文串。。。
无奈之下请教vfleaking,然后发现了这样的算法:
字典序hash。
我们先把所有串插入一个trie树,然后统计每个串的hash,然后再枚举每个串,沿trie树向下走,枚举每一个前缀,判断他们俩连起来的字符串正着和反着是否一样,
直接hash判断即可。
代码写起来不容易,我的代码快垫底了。。。
代码:

  1 #include<cstdio>
  2
  3 #include<cstdlib>
  4
  5 #include<cmath>
  6
  7 #include<cstring>
  8
  9 #include<algorithm>
 10
 11 #include<iostream>
 12
 13 #include<vector>
 14
 15 #include<map>
 16
 17 #include<set>
 18
 19 #include<queue>
 20
 21 #include<string>
 22
 23 #define inf 1000000000
 24
 25 #define maxn 2000000+10
 26
 27 #define maxm 2000000
 28
 29 #define eps 1e-10
 30
 31 #define ll long long
 32
 33 #define pa pair<int,int>
 34
 35 #define for0(i,n) for(int i=0;i<=(n);i++)
 36
 37 #define for1(i,n) for(int i=1;i<=(n);i++)
 38
 39 #define for2(i,x,y) for(int i=(x);i<=(y);i++)
 40
 41 #define for3(i,x,y) for(int i=(x);i>=(y);i--)
 42
 43 #define mod 1000000007
 44 #define base 131
 45
 46 using namespace std;
 47
 48 inline int read()
 49
 50 {
 51
 52     int x=0,f=1;char ch=getchar();
 53
 54     while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
 55
 56     while(ch>=‘0‘&&ch<=‘9‘){x=10*x+ch-‘0‘;ch=getchar();}
 57
 58     return x*f;
 59
 60 }
 61 int n,tot,t[maxn][27],g[maxn],len[maxm];
 62 ll f[maxn],h[maxn],ans,ha[maxm];
 63 char s[maxn];
 64 string st[maxm];
 65
 66 int main()
 67
 68 {
 69
 70     freopen("input.txt","r",stdin);
 71
 72     freopen("output.txt","w",stdout);
 73     h[0]=1;
 74     for1(i,maxn)h[i]=h[i-1]*base;
 75
 76     n=read();ans=-n;
 77     for1(k,n)
 78     {
 79         len[k]=read();
 80         scanf("%s",s+1);st[k]=s+1;
 81         int now=0;ll hash=0;
 82         for1(i,len[k])
 83          {
 84              int x=s[i]-‘a‘+1;
 85              if(!t[now][x])t[now][x]=++tot;
 86              now=t[now][x];
 87              hash=hash*base+x;
 88          }
 89         ha[k]=hash;
 90         f[now]=k;g[now]++;
 91     }
 92     for1(k,n)
 93     {
 94         int now=0;
 95         for0(i,len[k]-1)
 96          {
 97              int x=st[k][i]-‘a‘+1;
 98              now=t[now][x];
 99              if(g[now]&&ha[f[now]]*h[len[k]]+ha[k]==ha[k]*h[i+1]+ha[f[now]])ans+=(ll)g[now]*2;
100          }
101     }
102     printf("%lld\n",ans);
103
104     return 0;
105
106 }

时间: 2024-10-12 04:29:50

BZOJ1524: [POI2006]Pal的相关文章

bzoj1524【POI2006】Pal

1524: [POI2006]Pal Time Limit: 5 Sec  Memory Limit: 357 MB Submit: 367  Solved: 121 [Submit][Status][Discuss] Description 给出n个回文串s1, s2, -, sn 求如下二元组(i, j)的个数 si + sj 仍然是回文串 规模 输入串总长不超过2M bytes Input The first line of input file contains the number o

模拟摄像头解码模块最新测试 TVP5150模块 FPGA+SDRAM+TVP5150+VGA 实现PAL AV输入 VGA视频输出

模拟摄像头解码模块最新测试  TVP5150模块  FPGA+SDRAM+TVP5150+VGA  实现PAL AV输入 VGA视频输出 测试使用电视机顶盒的AV模拟信号输入,VGA显示器输出测试,效果如下 FPGA使用verilog编程,顶层RTL视图如下 module action_vip( input clk,input reset_n,input bt656_clk_27m,input [7:0] bt656_data, output [12:0] sdram_addr,//output

PAL/NTSC 制电视广播技术有关知识--FPGA

1.PAL和NTSC的区别 常见的电视信号制式是PAL和NTSC,另外还有SECAM等. NTSC即正交平衡调幅制,PAL为逐行倒像正交平衡调幅制. (1)PAL电视标准  PAL电视标准,每秒25帧,电视扫描线为625线,奇场在前,偶场在后,标准的数字化PAL电视标准分辨率为720*576, 24比特的色彩位深,画面的宽高比为4:3,PAL电视标准用于中国.欧洲等国家和地区. (2)NTSC电视标准  NTSC电视标准,每秒29.97帧(简化为30帧),电视扫描线为525线,偶场在前,奇场在后

bzoj1510[POI2006]Kra-The Disks*

bzoj1510[POI2006]Kra-The Disks 题意: 一个瓶子有n个节,每个节有一个宽度.现在要从上往下扔m个盘子,如果盘子的下一个位置宽度比该盘子的宽度小则盘子会停在这个位置.问最后一个盘子会停在那个位置.n,m≤300000. 题解: 首先利用单调栈去掉那些没用的节,之后对于每个盘子,二分大于等于它宽度的第一个节,尝试它能否再往下掉到无用的节,具体看代码. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #inclu

Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal ntsc

Atitit.软件控件and仪表盘(23)--多媒体子系统--视频输出切换控制cvbs av s-video Ypbpr pal  ntsc 1. CVBS是AV接口 1 2. S-Video S端子 1 3. Ypbpr/YPbPr和YCbCr色差 1 4.  2 5. 参考 2 七大常用视频接口效果对比   HDMI>DVI>VGA>色差>S端子 >av>tv 1. CVBS是AV接口 的视频信号(单根黄色线) CVBS 接口是音频.视频分离的视频接口,三个RCA插

PAL 安装报错及必备条件说明

1.PAL下载地址 http://pal.codeplex.com 2.使用PAL先决条件必须满足 1)Windows PowerShell 2.0 或更高版本 2).Net Framework 3.5 Service Pack 1 3).Net Framework 3.5中的微软图标控件 以上所有都要安装. 3.安装之后运行PAL在打开PowerShell 刚开始分析的时候忽然关掉窗口. 原因是:没有在用户文档文件夹下新建PAL Reports文件夹 如:C:\Users\{你的用户名}\Do

bzoj 1513 [POI2006]Tet-Tetris 3D(二维线段树)

1513: [POI2006]Tet-Tetris 3D Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 540  Solved: 175[Submit][Status] Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将

模拟摄像头,AV视频信号线解码,PAL制 NTSC,输入解码显示,终于搞定,记录下!

咱们常用的摄像头,监控等,大多数都是AV信号,国内制式都是PAL,采用同轴,传输,这样的好处在于,传输距离可以很长,且线路简单.视频阵列中也大多使用av摄像头. 常用的机顶盒,电视机,机顶盒最终输出的图像信号到电视机,绝大部分都是CVBS,混合信号,其中视频信号为AV,PAL制式. 所以pal制式信号,是相当流行,也相当适用.之前搞定了CMOS摄像头驱动,大多数并口信号线,ttl电平,因为信号线多,不易形成整列,如二马搞的汽车全景摄像头应该都是av信号,大家也可以看看自己的汽车,倒车摄像头是不是

【BZOJ1513】[POI2006]Tet-Tetris 3D 二维线段树

[BZOJ1513][POI2006]Tet-Tetris 3D Description Task: Tetris 3D "Tetris" 游戏的作者决定做一个新的游戏, 一个三维的版本, 在里面很多立方体落在平面板,一个立方体开始落下直到碰上一个以前落下的立方体或者落地即停止. 作者想改变一下游戏的目的使得它更大众化,在新游戏中你将知道落下的立方体信息以及位置,你的任务就是回答所有立方体落下后最高的方块的高度.所有的立方体在下落过程中都是垂直的并且不会旋转.平板左下角坐标为原点,并且