3-Palindromes

 
Problem code: PALIN3
 
 

All submissions for this problem are available.

Read problems statements in Mandarin Chinese and Russian as well.

Mike likes strings. He is also interested in algorithms. A few days ago he discovered for himself a very nice problem:


You are given a digit string S. You need to count the number of substrings of S, which are palindromes.

Do you know how to solve it? Good. Mike will make the problem a little bit more difficult for you.


You are given a digit string S. You need to count the number of substrings of S, which are palindromes without leading zeros and can be divided by 3 without a remainder.

A string is a palindrome if it reads the same backward as forward. A
string is a palindrome without leading zeros if it reads the same
backward as forward and doesn't start with symbol '0'. A string is a
digit string, if it doesn't contain any symbols except '0', '1', '2',
..., '9'.

Please, note that you should consider string "0" as a palindrome without leading zeros.

Input

The first line of the input contains a digit string S.

Output

Your output should contain the only integer, denoting the number of substrings of S, which are palindromes without leading zeros and can be divided by 3 without a remainder.

Constraints

1 ≤ |S| ≤ 1 000 000

Example

Input:
1045003 Output:
4

Explanation

In the example you should count S[2..2] = "0", S[5..5] = "0", S[6..6] = "0" and S[7..7] = "3".

给出一个数字串。

问有多少个子串既是回文串也能被3整除~

先用Manacher处理好串的回文串长度。

然后用一个数组 cnt[i][j] 表示sigma( 1 ~  i-1 到i 的数 ) %3 == j 串的个数。

#include <bits/stdc++.h>

using namespace std;
typedef long long LL ;
typedef pair<LL,LL> pii;
#define X first
#define Y second
const int N = ;
char Ma[N] , s[N];
int Mp[N] , len ;
void Manacher( char s[] , int len ) {
int l = ;
Ma[l++] = '$' ; Ma[l++] = '#' ;
for( int i = ; i < len ; ++i ) {
Ma[l++] = s[i];
Ma[l++] = '#' ;
}
Ma[l] = ; int mx = , id = ;
for( int i = ; i < l ; ++i ) {
Mp[i] = mx>i?min(Mp[*id-i],mx-i):;
while( Ma[i+Mp[i]] == Ma[i-Mp[i]] ) {
Mp[i]++;
}
if( i + Mp[i] > mx ) {
mx = i + Mp[i];
id = i ;
}
}
} bool is_dig( char op ) {
if( op >= '' && op <= '' ) return true ;
return false ;
}
LL cnt[N][] , sum[N] ; void Run() {
int n = strlen(s) ;
Manacher(s,n);
len = * n + ;
memset( sum , , sizeof sum );
memset( cnt , , sizeof cnt );
for( int i = ; i < len ; ++i ){
sum[i] = sum[i-];
if( is_dig(Ma[i]) ) sum[i] += ( Ma[i] - '' );
}
for( int i = ; i < len ; ++i ) {
if( !is_dig(Ma[i]) || Ma[i] == '' ) {
for( int j = ; j < ; ++j )
cnt[i][j] = cnt[i-][j];
}
else {
int x = Ma[i] - '' ;
for( int j = ; j < ; ++j ) {
int _j = (j+x)%;
cnt[i][_j] += cnt[i-][j] ;
}
cnt[i][x%]++;
}
}
LL ans = ;
for( int i = ; i < len ; ++i ) {
int x = , tmp = sum[i-] - sum[i-Mp[i]] ;
if( is_dig(Ma[i]) ) {
x = Ma[i] - '' ;
if( x % == ) ans++ ;
}
for( int j = ; j < ; ++j ) {
if( ( *j + x )% == ) {
ans += cnt[i-][j];
for( int z = ; z < ; ++z ) if( (z+tmp)% == j ){
ans -= cnt[i-Mp[i]][z];
}
}
}
}
printf("%lld\n",ans);
} int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int _ , cas = ;
while( scanf("%s",s) != EOF )Run();
}

CodeChef 3-Palindromes(Manacher+dp)的更多相关文章

  1. cf245H Queries for Number of Palindromes (manacher+dp)

    首先马拉车一遍(或者用hash),再做个前缀和处理出f[i][j]表示以j为右端点,左端点在[i,j]的回文串个数 然后设ans[i][j]是[i,j]之间的回文串个数,那就有ans[i][j]=an ...

  2. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  3. uva 11584 Partitioning by Palindromes 线性dp

    // uva 11584 Partitioning by Palindromes 线性dp // // 题目意思是将一个字符串划分成尽量少的回文串 // // f[i]表示前i个字符能化成最少的回文串 ...

  4. UVA 11584 "Partitioning by Palindromes"(DP+Manacher)

    传送门 •题意 •思路一 定义 dp[i] 表示 0~i 的最少划分数: 首先,用马拉车算法求解出回文半径数组: 对于第 i 个字符 si,遍历 j (0 ≤ j < i),判断以 j 为回文中 ...

  5. UVA - 11584 Partitioning by Palindromes[序列DP]

    UVA - 11584 Partitioning by Palindromes We say a sequence of char- acters is a palindrome if it is t ...

  6. 51nod 1595 回文度 | 马拉车Manacher DP

    51nod 1595 回文度 题目描述 如果长度为n的字符串是一个回文串,同时它的长度为floor(n/2)的前缀和后缀是K-1度回文串,则这个字符串被称为K度回文串.根据定义,任何字符串(即使是空字 ...

  7. HDU 5677 ztr loves substring(Manacher+dp+二进制分解)

    题目链接:HDU 5677 ztr loves substring 题意:有n个字符串,任选k个回文子串,问其长度之和能否等于L. 题解:用manacher算法求出所有回文子串的长度,并记录各长度回文 ...

  8. BZOJ 3790 神奇项链(manacher+DP+树状数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3790 [题目大意] 问最少用几个回文串可以构成给出串,重叠部分可以合并 [题解] 我们 ...

  9. Hrbust 2363 Symmys (Manacher + DP)

    题目链接  Hrbust 2363 来源  “科林明伦杯”哈尔滨理工大学第七届程序设计团队赛 Problem J 题意  给出一个长度为$1e6$的字符串,求最小可重回文子串覆盖数量 首先Manach ...

随机推荐

  1. C# List<object> 按特定字段排序

    using System; using System.Collections; using System.Collections.Generic; using System.Linq; using S ...

  2. 学Python的第四天

    第四天啦,今天依旧代码少的啃树皮.... 但是作业留的有了幼儿园的水准!!!让小编我看到了希望.... #!/usr/bin/env python # -*- coding:utf8 -*- impo ...

  3. css定位选择兄弟元素,nth-of-type

    <span class="input-group-btn" the-id="num-change"> <button class=" ...

  4. poj 3468 : A Simple Problem with Integers 【线段树 区间修改】

    题目链接 题目是对一个数组,支持两种操作 操作C:对下标从a到b的每个元素,值增加c: 操作Q:对求下标从a到b的元素值之和. #include<cstdio> #include<c ...

  5. iOS----收集的一些小技巧

    1,如何将试图置于最顶层 第一种方法 _myview.layer.zPosition =5; 第二种方法 [self.view insertSubview:_MyView atIndex:999]; ...

  6. Xenu Link Sleuth 简单好用的链接测试工具

    XenuLink Sleuth 名词介绍 “Xenu链接检测侦探”是被广泛使用的死链接检测工具.可以检测到网页中的普通链接.图片.框架.插件.背景.样式表.脚本和java程序中的链接. 那么神马时候出 ...

  7. linux命令学习记录

    1.查看目录和文件大小 du -sh ./* du -sh * | sort -nr 这个排序不正常都是因为-h参数的原因 du -s * | sort -nr | head 选出排在前面的10个 d ...

  8. Just Skip The Problem

    http://acm.hdu.edu.cn/showproblem.php?pid=6600 题意:给你一个数x,允许你多次询问yi,然后回答你x xor yi 是否等于yi,询问尽量少的次数以保证能 ...

  9. 攻防世界 | level2

    # ! /usr/bin/env python # -*- coding:utf-8 -*- from pwn import * context.log_level = 'debug' elf = E ...

  10. 调试 & 常数优化:我有特别的 debug 技巧

    rxz 的调试技巧(https://www.zhihu.com/question/60719584/answer/179363450): #define DEBUG printf("Pass ...