ural 1960 Palindromes and Super Abilities 题解

题意:给一个串s,按顺序一个个加入到序列里面。输出每次加入之后序列中的本质不同的回文串个数。

回文自动机模板题- -extend函数里面,如果那个if进去了,就代表多了一个本质不同的回文串。

 1 #include<cstdio>
 2 #include<cstring>
 3 const int MAXN=100000+5;
 4 const int SIGMA_SIZE=26;
 5 struct Node{
 6     int num,len;
 7     Node* go[SIGMA_SIZE],*fail;
 8     Node():fail(0) {num=len=0;memset(go,0,sizeof(go));}
 9 };
10 Node mem[MAXN],*cur=mem;
11 Node* root0,*root1;
12 Node* last;
13 void init()
14 {
15     cur=mem;
16     root0=cur++;
17     root1=cur++;
18     root0->fail=root1;
19     root1->len=-1;
20     last=root1;
21 }
22 inline Node* newNode(int len)
23 {
24     cur->len=len;
25     return cur++;
26 }
27 char s[MAXN];
28 int p=0;
29 inline Node* getFail(Node* t)
30 {
31     while(s[p- t->len -1]!=s[p]) t=t->fail;
32     return t;
33 }
34 int ans=0;
35 inline void extend(int w)
36 {
37     ++p;
38     Node* t=getFail(last);
39     if(!t->go[w])
40     {
41         Node* nt=newNode(t->len+2);
42         t->go[w]=nt;
43         if(t==root1) nt->fail=root0;
44         else nt->fail=getFail(t->fail)->go[w];
45         nt->num=nt->fail->num+1;
46         ++ans;
47     }
48     last=t->go[w];
49     printf("%d",ans);
50 }
51 int main()
52 {
53     init();
54     scanf("%s",s+1);
55     int n=strlen(s+1);
56     s[0]=‘$‘;
57     for(int i=1;i<=n;++i)
58     {
59         extend(s[i]-‘a‘);
60         if(i!=n) putchar(32);
61         else putchar(10);
62     }
63     return 0;
64 }

时间: 2024-12-19 07:39:35

ural 1960 Palindromes and Super Abilities 题解的相关文章

ural 1960 Palindromes and Super Abilities

题意:找出s[1..x]的本质不同的回文串的个数 分析:回文树模板题 /************************************************ Author :DarkTong Created Time :2016年09月21日 星期三 21时17分07秒 File Name :a.cpp *************************************************/ #include <bits/stdc++.h> using namespac

URAL 2040 Palindromes and Super Abilities 2(回文树)

Palindromes and Super Abilities 2 Time Limit: 1MS   Memory Limit: 102400KB   64bit IO Format: %I64d & %I64u Status Description Dima adds letters s1, -, sn one by one to the end of a word. After each letter, he asks Misha to tell him how many new pali

Ural 2040 Palindromes and Super Abilities 2

题目太坑,发一波纪念一下 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=5000010; 5 struct PAM{ 6 int cnt,last; 7 int a[N][2],l[N],f[N]; 8 char s[N]; 9 PAM(){ 10 cnt=f[0]=f[1]=1; 11 l[1]=-1; 12 } 13 int get_fail(int x,int

URAL 1932 The Secret of Identifier 题解

http://acm.timus.ru/problem.aspx?space=1&num=1932 B - The Secret of Identifier Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice URAL 1932 Description Davy Jones: You've been captain of the Black Pearl for

CodeForces - 592D Super M 题解

题目大意: 一棵树 n个点 有m个点被标记 求经过所有被标记的点的最短路径的长度以及起点(如有多条输出编号最小的起点). 思路: 1.当且仅当一个点本身或其子树中有点被标记时该点在最短的路径上因此,可以将多余的点删去,得到新的一棵树. 2.不难发现,新树上的边必定被经过一次或两次,而且当只经过一次的边的集合为树的直径时,路径最短. 反思: "如有多条输出编号最小的起点"是个坑点,要在最远的点中找出编号最小的当端点. 代码: 1 #include<cstdio> 2 #def

URAL 2040 (回文自动机)

Problem Palindromes and Super Abilities 2 题目大意 解题分析 参考程序 1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <string> 8 #include <vector>

回文自动机入门题

URAL-1960.Palindromes and Super Abilities 传送门 •题意 给你一个长度为 n 的字符串 s,下标从 1 开始: 输出 n 个数,第 i 个数表示 1~i 内有多少个本质不同的回文串: •题解 回文自动机入门题: 定义 ans[ i ] 表示 1~i 共有 $ans_{i}$ 个本质不同的回文串: $ans_{i}=ans_{i-1}$+{第 i 个字符可形成本质不同的回文串 ? 1:0}; •Code 1 #include<bits/stdc++.h>

LeetCode: palindromes 题解

Determine whether an integer is a palindrome. Do this without extra space. Some hints: Could negative integers be palindromes? (ie, -1) If you are thinking of converting the integer to string, note the restriction of using extra space. You could also

Petrozavodsk Winter-2013. Ural FU Contest Problem D. Five Palindromes manacher、一个串切割成5个回文子串、优化

Ural Federal University Contest, SKB Kontur Cup Petrozavodsk Winter Training Camp, Saturday, February 2, 2013 Problem D. Five Palindromes Input file: input.txt Output file: output.txt Time limit: 2 seconds (3 seconds for Java) Memory limit: 256 mebib