关闭

UVALive 7041 The Problem to Slow Down You(回文树)

404人阅读 评论(0) 收藏 举报
分类:

思路:一个回文树的应用...作为智障选手只会套版...


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
const int MAXN = 400005 ;
const int N = 26 ;
LL ans = 0;
struct Palindromic_Tree {
	int next[MAXN][N] ;//next指针,next指针和字典树类似,指向的串为当前串两端加上同一个字符构成
	int fail[MAXN] ;//fail指针,失配后跳转到fail指针指向的节点
	LL cnt[MAXN] ;
	int num[MAXN] ;
	int len[MAXN] ;//len[i]表示节点i表示的回文串的长度
	LL cnt1[MAXN];
	int S[MAXN] ;//存放添加的字符
	int last ;//指向上一个字符所在的节点,方便下一次add
	int n ;//字符数组指针
	int p ;//节点指针

	int newnode ( int l ) {//新建节点
		for ( int i = 0 ; i < N ; ++ i ) next[p][i] = 0 ;
		cnt[p] = 0 ;
		cnt1[p] = 0;
		num[p] = 0 ;
		len[p] = l ;
		return p ++ ;
	}

	void init () {//初始化
		p = 0 ;
		newnode (  0 ) ;
		newnode ( -1 ) ;
		last = 0 ;
		n = 0 ;
		S[0] = -1 ;//开头放一个字符集中没有的字符,减少特判
		fail[0] = 1 ;
	}
    void init1()
	{
		last = 0;
		S[0]=-1;
		fail[0]=1;
		n=0;
	}
	int get_fail ( int x ) {//和KMP一样,失配后找一个尽量最长的
		while ( S[n - len[x] - 1] != S[n] ) x = fail[x] ;
		return x ;
	}

	void add ( int c ) {
		c -= 'a' ;
		S[++ n] = c ;
		int cur = get_fail ( last ) ;//通过上一个回文串找这个回文串的匹配位置
		if ( !(last = next[cur][c]) ) {//如果这个回文串没有出现过,说明出现了一个新的本质不同的回文串
			int now = newnode ( len[cur] + 2 ) ;//新建节点
			fail[now] = next[get_fail ( fail[cur] )][c] ;//和AC自动机一样建立fail指针,以便失配后跳转
			next[cur][c] = now ;
		//	num[now] = num[fail[now]] + 1 ;
		    last = now;
		}
	//	last = next[cur][c] ;
		cnt[last] ++ ;
	}
    void add1 ( int c ) {
		c -= 'a' ;
		S[++ n] = c ;
		int cur = get_fail ( last ) ;//通过上一个回文串找这个回文串的匹配位置
		if ( !(last = next[cur][c]) ) {//如果这个回文串没有出现过,说明出现了一个新的本质不同的回文串
			int now = newnode ( len[cur] + 2 ) ;//新建节点
			fail[now] = next[get_fail ( fail[cur] )][c] ;//和AC自动机一样建立fail指针,以便失配后跳转
			next[cur][c] = now ;
			//num[now] = num[fail[now]] + 1 ;
			last = now;
		}
		//last = next[cur][c] ;
		cnt1[last] ++ ;
	}

	void count () {
		for ( int i = p - 1 ; i >= 0 ; i-- ) cnt[fail[i]] += cnt[i];
		//父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串!
	}


	void count1 () {
		for ( int i = p - 1 ; i >= 0 ; -- i ) cnt1[fail[i]] += cnt1[i];
		//父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串!
	}
	void cal()
	{
		for(int i = 2;i<=p-1;i++)
			ans+=cnt[i]*cnt1[i];
	}

}tree;
char s1[200005];
char s2[200005];

int main()
{
    int T,cas=1;
	scanf("%d",&T);
	while(T--)
	{
		ans = 0;
		tree.init();
		scanf("%s",s1);
		int len1 = strlen(s1);
        for(int i = 0;i<len1;i++)
			tree.add(s1[i]);
		tree.count();
		scanf("%s",s2);
		tree.init1();
        int len2 = strlen(s2);
		for(int i = 0;i<len2;i++)
			tree.add1(s2[i]);
		tree.count1();
		tree.cal();
		printf("Case #%d: %lld\n",cas++,ans);
	}
}


0
0
查看评论

UVAlive 7041 The Problem to Slow Down You(回文树)

UVAlive 7041 The Problem to Slow Down You(回文树)
  • Dacc123
  • Dacc123
  • 2016-05-18 16:28
  • 481

UVA 7041 The Problem to Slow Down You (回文树)

The Problem to Slow Down YouAfter finishing his homework, our problem setter Federmann decided to kill time by hanging around online. He found a cool ...
  • mrlry
  • mrlry
  • 2016-10-03 20:32
  • 123

Codeforces 100548G - The Problem to Slow Down You & UVAlive 7041 :回文自动机

无病呻吟:字符串算法好像还剩下后缀树。。但是他好像和后缀自动机差不多的样子(这就是你划水的原因吗?)?以及还剩下一个KMP自动机。。。但是他好像和KMP也没什么区别的样子(同上?)?以及好不容易补上了PAM这个坑。。。15年西安出了一个PAM的题,成了难题,17年哈尔滨又来了一次,这次就是中等题了。...
  • calabash_boy
  • calabash_boy
  • 2017-10-23 15:25
  • 88

UVALive - 7041 回文树

题目链接:https://vjudge.net/problem/UVALive-7041 题意:求两个串的公共回文串的个数。 解法:回文树。回文树学习资料:http://blog.csdn.net/u013368721/article/details/42100363 然后这题就成为了裸题。从...
  • just_sort
  • just_sort
  • 2017-09-22 10:22
  • 122

Gym100548G-The Problem to Slow Down You

题意:给你两个长度不超过20W的字符串, 都只包含小写字母, 求相同的回文串对数 (S, T), 其中S == T, S来自第一个字符串, T来自第二个字符串, S和T都是回文串 解题思路:对两个字符串都建回文树,然后对回文树进行dfs即可 #include #include #includ...
  • a664607530
  • a664607530
  • 2017-10-10 20:54
  • 72

Gym - 100548G The Problem to Slow Down You

题目:给出A,B两个字符串,求A,B中相同的回文串的对数 思路:对A,B分别建一个回文树,然后分别从奇数根节点和偶数做一次dfs 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include #in...
  • ACVector
  • ACVector
  • 2017-09-13 09:22
  • 95

iphone 提示(alert):[App] May Slow Down Your iPhone解决办法

iOS10之后添加了对32位应用程序的报警提示:“[App] May Slow Down Your iPhone”。这个提示的解释是:[应用程序名称]可能会减慢您的iPhone”,一个lug lug,你正在运行的是一个32位的应用程序,没有遵守苹果64位应用程序的政策。这个APP是一个没有进行优化的...
  • u011467458
  • u011467458
  • 2016-11-16 15:11
  • 1469

Intellij idea:Method breakpoints my dramatically slow down debugging

使用idea在DEBUG的时候出现Method breakpoints may dramatically slow down debugging,检查了下知道可能是断点打在方法上面了, 可是无奈找不到方法断点打在哪里。 重启服务器和重启idea也还是报这个错。 由该提示语我们可以知道要...
  • FourSeasonSunshine
  • FourSeasonSunshine
  • 2016-09-26 15:43
  • 4434

IDEA调试:Method breakpoints may dramatically slow down debugging

问题:Method breakpoints may dramatically slow down debugging原因:在方法上设置了断点解决方法:去掉方法断点即可
  • lu_wei_wei
  • lu_wei_wei
  • 2017-07-25 13:46
  • 1026

Codeforce 2014ACM-ICPC, Asia Xian Regional Contest Problem G. The Problem to Slow Down You(回文树)

Problem G. The Problem to Slow Down You Description After finishing his homework, our problem setter Federmann decided to kill time by hanging around ...
  • yu_ch_sh
  • yu_ch_sh
  • 2015-10-30 15:25
  • 616
    个人资料
    • 访问:344728次
    • 积分:13771
    • 等级:
    • 排名:第1100名
    • 原创:1084篇
    • 转载:3篇
    • 译文:0篇
    • 评论:53条
    最新评论