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 loc){
14         while(s[loc-l[x]-1]!=s[loc])x=f[x];
15         return x;
16     }
17     void insert(int c,int loc){
18         int p=get_fail(last,loc);
19         if(!a[p][c]){
20             int now=++cnt,k=get_fail(f[p],loc);
21             l[now]=l[p]+2;
22             f[now]=a[k][c];a[p][c]=now;
23         }
24         last=a[p][c];
25     }
26 }P;
27 char fuck[N];
28 int main(){
29     scanf("%s",P.s);
30     int n=strlen(P.s);
31     for(int i=0;i<n;++i){
32         int ls=P.cnt;
33         P.insert(P.s[i]-‘a‘,i);
34         fuck[i]=(P.cnt-ls?1:0)+‘0‘;
35     }
36     puts(fuck);
37     return 0;
38 }
时间: 2024-10-11 11:19:29

Ural 2040 Palindromes and Super Abilities 2的相关文章

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 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 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],*

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>

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

回文串+回溯法 URAL 1635 Mnemonics and Palindromes

题目传送门 1 /* 2 题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 3 回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数量,最大值是i+1,即单个回文串: 4 之前设置ok[j][j+i] 判断从j到j+i的字符是否为回文串(注意两个for的顺序,为满足ok[j][j+i] = ok[j+1][j+i-1]) 5 最后枚举找到最优划分点,用pre[i]记录前一个位置,print函数 输出空格 6 */ 7

Ural 1635 Mnemonics and Palindromes(DP)

题目地址:Ural 1635 又是输出路径的DP...连着做了好多个了.. 状态转移还是挺简单的.要先预处理出来所有的回文串,tag[i][j]为1表示字符串i--j是一个回文串,否则不是回文串.预处理时要用n^2的方法,即枚举回文串中间,可以分奇数和偶数两种分别求一次. 然后dp转移方程为,若tag[j][i]==1,dp[i]=min(dp[i],dp[j-1]+1); 对于最令人讨厌的路径输出,可以用pre来记录回文串前驱分裂点,然后根据这些分裂点来输出. 代码如下: #include <

ural Mnemonics and Palindromes (dp)

http://acm.timus.ru/problem.aspx?space=1&num=1635 给出一个字符串,将这个字符串分成尽量少的回文串. 起初没有思路,想着应该先预处理出所有的回文串,然后进行dp.但是字符串的长度是4000,O(n^3)肯定不行,其实可以转化为O(n^2),就是枚举中点而不是枚举起点和终点,又NC了吧. 然后就是线性的dp了.dp[i]表示到第i位为止最少的回文串数,那么dp[i] = min(dp[i],dp[j+1]+1),j < i 且i到j也是回文串.