bzoj4044
这题简直了…………
首先根据操作可知,我们肯定是先造出某个偶数长度的回文串,然后添加若干字符得到设回文串长为len[x]
则ans=min(n-len[x]+f[x]);
那么问题就是制造这个串的回文串,最少的操作次数
对于回文串x,我们有这种情况
f[x]=min(f[y]+1,(y是x去掉首尾),f[y]+len[x]-len[y](y是最长回文前缀,(其实这个可以不考虑,因为这就相当于直接制造y)
=(f[y]+len[x] div 2-len[y]+1,y是长度不超过x一半的最长回文后缀)
dp大家都会,但状态怎么表示呢?………………
显然一个串回文串不超过n,但是怎么表示之间的关系呢?
我曾yy了一种manacher+后缀自动机的做法,结果是又WA又T一时爽……
无奈学了一下回文树,感觉是非常简洁明快的
学习可以转到:http://pan.baidu.com/s/1hqzRlvm
感觉有点像ac自动机,还是比较好懂的,这样就简单了
但我pascal本地AC交上去不停RE不知为何……
var go:array[..,..] of longint;
len,fa,sub,a,q,f:array[..] of longint;
last,t,ans,i,tt,n:longint;
s:ansistring; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function what(ch:char):longint;
begin
if ch='A' then exit();
if ch='T' then exit();
if ch='C' then exit();
if ch='G' then exit();
exit(-);
end; procedure getchar;
var i:longint;
begin
readln(s);
n:=length(s);
a[n+]:=-;
for i:= to n do
a[i]:=what(s[i]);
end; function getf(x:longint):longint;
begin
while a[i-len[x]-]<>a[i] do x:=fa[x];
exit(x);
end; procedure newnode(l:longint);
begin
inc(t);
fillchar(go[t],sizeof(go[t]),);
len[t]:=l;
fa[t]:=;
end; procedure add(c:longint);
var now,cur,x:longint;
begin
cur:=getf(last);
if go[cur,c]= then
begin
newnode(len[cur]+); now:=t;
fa[now]:=go[getf(fa[cur]),c];
go[cur,c]:=now;
if len[now]<= then f[now]:=len[now]
else begin
x:=sub[cur];
while (a[i-len[x]-]<>a[i]) or (*(len[x]+)>len[now]) or (len[x] mod =) do x:=fa[x];
sub[now]:=go[x,c];
end;
end;
last:=go[cur,c];
end; procedure bfs;
var h,r,x,y,i,w:longint;
begin
h:=;
r:=;
q[]:=;
f[]:=;
while h<=r do
begin
x:=q[h];
for i:= to do
begin
y:=go[x,i];
if y<> then
begin
inc(r);
q[r]:=y;
if len[y]> then
begin
f[y]:=min(f[x]+,len[y] div -len[sub[y]]+f[sub[y]]+);
ans:=min(ans,n-len[y]+f[y]);
end;
end;
end;
inc(h);
end;
end; begin
readln(tt);
while tt> do
begin
dec(tt);
getchar;
t:=-;
newnode();
newnode(-);
fa[]:=;
last:=;
for i:= to n do
add(a[i]);
ans:=n;
bfs;
writeln(ans);
end;
end.
bzoj4044的更多相关文章
- bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp)
bzoj4044/luoguP4762 [Cerc2014]Virus synthesis(回文自动机+dp) bzoj Luogu 你要用ATGC四个字母用两种操作拼出给定的串: 1.将其中一个字符 ...
- bzoj4044 [Cerc2014] Virus synthesis
回文自动机上dp f[x]表示形成x代表的回文串所需的最小步数, 若len[x]为奇数,f[x]=len[x],因为即使有更优的,也是直接添加,没有复制操作,那样就不用从x转移了. 若len[x]为偶 ...
- [BZOJ4044]Virus synthesis 回文自动机的DP
4044: [Cerc2014] Virus synthesis Time Limit: 20 Sec Memory Limit: 128 MB Description Viruses are us ...
- Bzoj4044 Virus synthesis
题意 你要用 \(ATGC\) 四个字母用两种操作拼出给定的串: 将其中一个字符放在已有串开头或者结尾 将已有串复制,然后 \(reverse\) ,再接在已有串的头部或者尾部 一开始已有串为空.求最 ...
- BZOJ4044: [Cerc2014] Virus synthesis(回文树+DP)
Description Viruses are usually bad for your health. How about fighting them with... other viruses? ...
- 【XSY2534】【CF835D】Palindromic characteristics 回文自动机
题目大意 一个字符串\(s\)是\(1\)−回文串当且仅当这个串是回文串. 一个串\(s\)是\(k\)−回文串\((k>1)\)当且仅当\(s\)的前一半与后一半相同且\(s\)的前一 ...
随机推荐
- C# WPF打印报表
前天我的一个同学由于打印报表而苦恼,所以就介绍了一下WPF的打印报表,希望能帮助到大家. 展示报表 1. 首先新建项“报表”,选定项目,右击,点击“添加”->“新建项”->“报表”
- QT windows msvc下使用boost库(备忘)
win32-msvc2015: { contains(QMAKE_HOST.arch, x86):{ INCLUDEPATH += D:\3SDK\boost_1_61_0 LIBS += -LD:\ ...
- 【单调栈】Bzoj 1012: 最大数maxnumber
1012: [JSOI2008]最大数maxnumber Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6255 Solved: 2676[Submi ...
- linux “命令行自动补全”功能用命令
是按Tab键,左上角ESC的下面两个,如果你当前目录只有一项,只需要直接Tab,如果有多项,输入前面不同的部分再Tab,一般输入3个字母就可以,如果按一下没效果,按两下会列出所有项,然后再输入一点自己 ...
- HDU 1598 find the most comfortable road(枚举+并查集,类似于最小生成树)
一开始想到用BFS,写了之后,发现有点不太行.网上查了一下别人的解法. 首先将边从小到大排序,然后从最小边开始枚举,每次取比它大的边,直到start.end属于同一个集合,即可以连通时停止.过程类似于 ...
- java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析
/** * 栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放 在常量池中). 堆(heap):存 ...
- 由CHAR(2)引发的BUG
我们在设计数据库标志位字段时,为考虑其扩展性,一般会设置为CHAR(2),例如 FLAG CHAR(2),这样我们就需要注意了,如果你给字段 FLAG赋值为‘0’,它在数据库中的真实情况是‘0+空格’ ...
- Android ImageButton的背景(图片)大小
使用ImageButton的background属性,而不用src属性. 然后使用width和height进行调整.
- 20. atoi函数
/* 输入一个表示整数的字符串,把该字符串转换成整数并输出 */ #include<iostream> #include<string> using namespace std ...
- 此版本的 SQL Server 不支持用户实例登录标志。该连接将关闭“的解决
此版本的 SQL Server 不支持用户实例登录标志.该连接将关闭“的解决(转) 2008-10-04 13:31 错误提示:说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息 ...