Finding Palindromes - 猥琐的字符串(Manacher+trie)
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- using namespace std;
- const int MAXN = 2e6+;
- const int oo = 1e9+;
- struct Trie
- {///字典树的节点
- int next[];
- int leaf;///以这个节点为终点的叶子节点个数
- int count;///后面回文串的数量
- void Free()
- {
- leaf = count = ;
- memset(next, false, sizeof(next));
- }
- }trie[MAXN];
- int top;///配合字典树使用,top表示没有使用的内存
- int start[MAXN], p[MAXN<<];
- char MumStr[MAXN], Estr[MAXN<<];
- bool suffix[MAXN];///后缀是否是回文串
- bool prefix[MAXN];///前缀是否是回文串
- void BuildTrie(int n)
- {
- int p = ;
- for(int i=start[n+]-; i>=start[n]; i--)
- {///把字符串倒插进去
- int k = MumStr[i] - 'a';
- trie[p].count += prefix[i];
- if(trie[p].next[k] == )
- {
- trie[p].next[k] = ++top;
- trie[top].Free();
- }
- p = trie[p].next[k];
- }
- trie[p].leaf += ;
- }
- void Manacher(int n)
- {
- int i, id=, len=;
- Estr[] = '$';
- for(i=start[n]; i<start[n+]; i++)
- {
- Estr[len++] = '#';
- Estr[len++] = MumStr[i];
- suffix[i] = false;
- prefix[i] = false;
- }
- Estr[len] = '#';
- Estr[len+] = ;
- for(i=; i<len; i++)
- {
- p[i] = ;
- if(p[id]+id > i)
- p[i] = min(p[id*-i], p[id]+id-i);
- while(Estr[ i+p[i] ] == Estr[ i-p[i] ])
- p[i]++;
- if(p[id]+id < p[i]+i)
- id = i;
- if(p[i] == i)
- prefix[ start[n]+p[i]- ] = true;
- if(p[i]+i- == len)
- suffix[ start[n+]-p[i]+ ] = true;
- }
- }
- int Query(int n)
- {
- int i, p=, sum = ;
- for(i=start[n]; i<start[n+]; i++)
- {
- int k = MumStr[i] - 'a';
- if(trie[p].next[k] == )
- break;
- p = trie[p].next[k];
- if(suffix[i+] || i==start[n+]-)
- sum += trie[p].leaf;
- }
- if(i == start[n+])
- sum += trie[p].count;
- return sum;
- }
- int main()
- {
- int N;
- while(scanf("%d", &N) != EOF)
- {
- int i, len;
- top = ;
- trie[].Free();
- for(i=; i<=N; i++)
- {
- scanf("%d%s", &len, MumStr+start[i]);
- start[i+] = start[i] + len;
- Manacher(i);
- BuildTrie(i);
- }
- long long ans = ;
- for(i=; i<=N; i++)
- ans += Query(i);
- printf("%lld\n", ans);
- }
- return ;
- }
- /**
- 2
- 3 abc
- 4 acba
- */
Finding Palindromes - 猥琐的字符串(Manacher+trie)的更多相关文章
- POJ 3376 Finding Palindromes(manacher求前后缀回文串+trie)
题目链接:http://poj.org/problem?id=3376 题目大意:给你n个字符串,这n个字符串可以两两组合形成n*n个字符串,求这些字符串中有几个是回文串. 解题思路:思路参考了这里: ...
- poj3376 Finding Palindromes【exKMP】【Trie】
Finding Palindromes Time Limit: 10000MS Memory Limit: 262144K Total Submissions:4710 Accepted: 8 ...
- POJ3376 Finding Palindromes —— 扩展KMP + Trie树
题目链接:https://vjudge.net/problem/POJ-3376 Finding Palindromes Time Limit: 10000MS Memory Limit: 262 ...
- POJ 3376 Finding Palindromes(扩展kmp+trie)
题目链接:http://poj.org/problem?id=3376 题意:给你n个字符串m1.m2.m3...mn 求S = mimj(1=<i,j<=n)是回文串的数量 思路:我们考 ...
- poj 3376 Finding Palindromes
Finding Palindromes http://poj.org/problem?id=3376 Time Limit: 10000MS Memory Limit: 262144K ...
- PHP后门新玩法:一款猥琐的PHP后门分析
0x00 背景 近日,360网站卫士安全团队近期捕获一个基于PHP实现的webshell样本,其巧妙的代码动态生成方式,猥琐的自身页面伪装手法,让我们在分析这个样本的过程中感受到相当多的乐趣.接下来就 ...
- 模板—字符串—Manacher
模板—字符串—Manacher Code: #include <cstdio> #include <cstring> #include <algorithm> us ...
- delphi之猥琐的webserver实现
http://www.birdol.com/cainiaobiancheng/238.html delphi之猥琐的webserver实现 菜鸟编程 十五楼的鸟儿 7年前 (2009-01-01) ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
随机推荐
- 关于cocoapods和swift中使用oc第三方
mac 系统自带ruby,使用cocoapods,直接安装cocoapods就行 终端:$ sudo gem install cocoapods {安装较慢是因为有墙,查看ruby镜像列表:$ gem ...
- 类和ID选择器的区别
学习了类选择器和ID选择器,我们会发现他们之间有很多的相似处,是不是两者可以通用呢?我们不要着急先来总结一下他们的相同点和不同点: 相同点:可以应用于任何元素不同点: 1.ID选择器只能在文档中使用一 ...
- 外部式css样式,写在单独的一个文件中
外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内(不是在<style>标签内)使用<l ...
- [转载]hadoop SecondNamenode详解
SecondNamenode名字看起来很象是对第二个Namenode,要么与Namenode一样同时对外提供服务,要么相当于Namenode的HA.真正的了解了SecondNamenode以后,才发现 ...
- csv文本编辑引号问题
今天发现一个csv的一个问题,csv工具类对于引号默认有特殊的处理.我希望写出来的结果是 1,"1",1 原来的代码是 CsvWriter cw=new CsvWriter(&qu ...
- 不使用ASP.NET服务器端控件(包括form表单不加runat="server")来触发.cs里的事件(方法),(适用于有代码洁癖者)。
很多时候,我们使用服务器端控件写出的代码,会给我们生成一些很多我们看不懂的代码(初学者),但是有时候我们并不需要这些代码(业务需求不同),对于生成的一些代码感到多余.所以我就开始想,有没有一种可能:不 ...
- 关于unitils联合dbunit的测试
unitils据说测试的能力很强大,可测试dao,service,web层,其实对数据库的测试我更关心,看到有人展示了测试的方法,数据直接写在xls表中,很直观,然后就依照他们的方法进行试验,花费的时 ...
- strcpy实现
#include <iostream> using namespace std; char *strcpy(char *strDest, const char *strSrc) { if ...
- ibatis动态语句加and 和不加and
<select id="queryGoodsGroupCodeName" parameterClass="String" resultClass=&quo ...
- MSP430的IO口模拟I2C总线对AT24C25进行读写程序
功能: 实现MSP430口线模拟I2C总线协议与24C04通信. ** 描述: 主系统工作时钟为12MHz,I2C工 ...