计蒜客 2018南京网络赛 I Skr ( 回文树 )
题意 : 给出一个由数字组成的字符串、然后要你找出其所有本质不同的回文子串、然后将这些回文子串转化为整数后相加、问你最后的结果是多少、答案模 1e9+7
分析 :
应该可以算是回文树挺裸的题目吧
可惜网络赛的时候不会啊、看着马拉车想半天、卒...
对于每一个节点、记录其转化为整数之后的值
然后在回文串插入字符的时候
不断维护这个信息就行了
其实很好理解、看一下代码就懂了 ( 如果你学过回文树的话... )
就是多加了变量 val 、维护语句
#include<bits/stdc++.h>
#define LL long long
#define ULL unsigned long long
#define scl(i) scanf("%lld", &i)
#define scll(i, j) scanf("%lld %lld", &i, &j)
#define sclll(i, j, k) scanf("%lld %lld %lld", &i, &j, &k)
#define scllll(i, j, k, l) scanf("%lld %lld %lld %lld", &i, &j, &k, &l)
#define scs(i) scanf("%s", i)
#define sci(i) scanf("%d", &i)
#define scd(i) scanf("%lf", &i)
#define scIl(i) scanf("%I64d", &i)
#define scii(i, j) scanf("%d %d", &i, &j)
#define scdd(i, j) scanf("%lf %lf", &i, &j)
#define scIll(i, j) scanf("%I64d %I64d", &i, &j)
#define sciii(i, j, k) scanf("%d %d %d", &i, &j, &k)
#define scddd(i, j, k) scanf("%lf %lf %lf", &i, &j, &k)
#define scIlll(i, j, k) scanf("%I64d %I64d %I64d", &i, &j, &k)
#define sciiii(i, j, k, l) scanf("%d %d %d %d", &i, &j, &k, &l)
#define scdddd(i, j, k, l) scanf("%lf %lf %lf %lf", &i, &j, &k, &l)
#define scIllll(i, j, k, l) scanf("%I64d %I64d %I64d %I64d", &i, &j, &k, &l)
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(i) (i & (-i))
#define mem(i, j) memset(i, j, sizeof(i))
#define fir first
#define sec second
#define VI vector<int>
#define ins(i) insert(i)
#define pb(i) push_back(i)
#define pii pair<int, int>
#define VL vector<long long>
#define mk(i, j) make_pair(i, j)
#define all(i) i.begin(), i.end()
#define pll pair<long long, long long>
#define _TIME 0
#define _INPUT 0
#define _OUTPUT 0
clock_t START, END;
void __stTIME();
void __enTIME();
void __IOPUT();
using namespace std;
;
LL pow_mod(LL a, LL b)
{
    a %= mod;
    LL ret = ;
    while(b){
        ) ret = ret * a % mod;
        a = a * a % mod;
        b >>= ;
    }return ret;
}
 + ;
 ;
struct Palindromic_Tree {
    int next[maxn][N] ;//next指针,next指针和字典树类似,指向的串为当前串两端加上同一个字符构成
    int fail[maxn] ;//fail指针,失配后跳转到fail指针指向的节点
    int cnt[maxn] ;
    int num[maxn] ;
    int len[maxn] ;//len[i]表示节点i表示的回文串的长度
    int S[maxn] ;//存放添加的字符
    int last ;//指向上一个字符所在的节点,方便下一次add
    int n ;//字符数组指针
    int tot ;//节点指针
    LL val[maxn];
    int newnode ( int l ) {//新建节点
         ; i < N ; ++ i ) next[tot][i] =  ;
        cnt[tot] =  ;
        num[tot] =  ;
        val[tot] = 0LL;
        len[tot] = l ;
        return tot ++ ;
    }
    void init () {//初始化
        tot =  ;
        newnode (   ) ;
        newnode ( - ) ;
        last =  ;
        n =  ;
        S[n] = - ;//开头放一个字符集中没有的字符,减少特判
        fail[] =  ;
    }
    int get_fail ( int x ) {//和KMP一样,失配后找一个尽量最长的
        ] != S[n] ) x = fail[x] ;
        return x ;
    }
    void add ( int c ) {
        c -= ' ;
        S[++ n] = c ;
        int cur = get_fail ( last ) ;//通过上一个回文串找这个回文串的匹配位置
        if ( !next[cur][c] ) {//如果这个回文串没有出现过,说明出现了一个新的本质不同的回文串
             ) ;//新建节点
            fail[now] = next[get_fail ( fail[cur] )][c] ;//和AC自动机一样建立fail指针,以便失配后跳转
            next[cur][c] = now ;
            num[now] = num[fail[now]] +  ;
        }
        int pre = cur;
        last = next[cur][c] ;
        //c*10^(len[pre]+1) + val[pre]*10 + c
        ) val[last] = c;
        ) % mod + (c * pow_mod(, len[pre]+) % mod ) % mod + c ) % mod;
        cnt[last] ++ ;
    }
    void count () {
         ; i >=  ; -- i ) cnt[fail[i]] += cnt[i] ;
        //父亲累加儿子的cnt,因为如果fail[v]=u,则u一定是v的子回文串!
    }
}PAM;
char s[maxn];
int main(void){__stTIME();__IOPUT();
    PAM.init();
    scanf("%s", s);
    int len = strlen(s);
    ; i<len; i++) PAM.add(s[i]);
    PAM.count();
    LL ans = ;
    ; i<PAM.tot; i++)
        ans = (ans + PAM.val[i]) % mod;
    printf("%lld\n", ans);
__enTIME();;}
void __stTIME()
{
    #if _TIME
        START = clock();
    #endif
}
void __enTIME()
{
    #if _TIME
        END = clock();
        cerr<<"execute time = "<<(double)(END-START)/CLOCKS_PER_SEC<<endl;
    #endif
}
void __IOPUT()
{
    #if _INPUT
        freopen("in.txt", "r", stdin);
    #endif
    #if _OUTPUT
        freopen("out.txt", "w", stdout);
    #endif
}
计蒜客 2018南京网络赛 I Skr ( 回文树 )的更多相关文章
- 南京网络赛I-Skr【回文树模板】
		
19.32% 1000ms 256000K A number is skr, if and only if it's unchanged after being reversed. For examp ...
 - 计蒜客2018 蓝桥杯省赛 B 组模拟赛(一)
		
1,结果填空:年龄 今天蒜头君带着花椰妹和朋友们一起聚会,当朋友们问起年龄的时候,蒜头君打了一个哑谜(毕竟年龄是女孩子的隐私)说:“我的年龄是花椰妹年龄个位数和十位数之和的二倍”. 花椰妹看大家一脸懵 ...
 - 2018南京网络赛L题:Magical Girl Haze(最短路分层图)
		
题目链接:https://nanti.jisuanke.com/t/31001 解题心得: 一个BZOJ的原题,之前就写过博客了. 原题地址:https://www.lydsy.com/JudgeOn ...
 - 计蒜客蓝桥杯模拟赛  后缀字符串:STL_map+贪心
		
问题描述 一天蒜头君得到 n 个字符串 si,每个字符串的长度都不超过 10. 蒜头君在想,在这 n 个字符串中,以 si 为后缀的字符串有多少个呢? 输入格式 第一行输入一个整数 n. 接下来 ...
 - 计蒜客蓝桥杯模拟赛五J. 程序设计:放置守卫
		
在一张 n 行 m 列的方格地图上放置一些守卫,每个守卫能守护上.左.右三个方向上相邻的方格和自己所在的方格.如下图,红色的方格放置守卫,绿色的方格为该守卫守护的区域. 现在要求在地图上放置若干个守卫 ...
 - 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]
		
题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...
 - 2018南京网络赛 - Skr 回文树
		
题意:求本质不同的回文串(大整数)的数字和 由回文树的性质可知贡献只在首次进入某个新节点时产生 那么只需由pos和len算出距离把左边右边删掉再算好base重复\(O(n)\)次即可 位移那段写的略微 ...
 - ICPC 2018 南京网络赛 J Magical Girl Haze(多层图最短路)
		
传送门:https://nanti.jisuanke.com/t/A1958 题意:n个点m条边的路,你有k次机会将某条路上的边权变为0,问你最短路径长度 题解:最短路变形,我们需要在常规的最短路上多 ...
 - ACM-ICPC 2018 南京网络赛
		
题目顺序:A C E G I J L A. An Olympian Math Problem 打表,找规律,发现答案为n-1 C. GDY 题意: m张卡片,标号1-13: n个玩家,标号1-n:每个 ...
 
随机推荐
- PTA(Basic Level)1030.完美数列
			
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤*m**p*,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. ...
 - 编程竞赛--关于"数"的概念
			
质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数. 合数:合数是指自然数中除了能被1和本身整除外,还能被其他数(0除外)整数的数.与之相对的是质数,而1既不属于质数也不属于合 ...
 - stm32F429启动时钟配置
			
STM32f429在启动时会在startup_stm32f429_439xx.s中调用static void SetSysClock(void)函数.默认使用的是25M晶振,把系统时钟设置为180M. ...
 - 【Tomcat】热部署的遗留配置导致服务器无法启动
			
1.问题描述: 今天用myeclipse写了个小demo,然后用Tomcat7 部署了,接着点击启动服务器,服务器居然报错: 严重: Error starting static Resources j ...
 - ajax实现异步操作实例1
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - Javascript问题集锦
			
1.Date.parse()函数兼容性问题: IE Chrome Firefox Date.parse("07-17-2019") 1563292800000 15632928 ...
 - node.js学习之路(1)
			
node.js 属于后台语言,后台语言还有php,java等. 优势:1.性能好 node.js VS php 86倍 2.跟前台JS配合方便 3.node.js便于前端学习 https:// ...
 - new Date,Date.parse()传值
			
获取时间: 获取1997年10月1号日期 new Date: 当使用 - 拼接年月日时将会使用UTC时区解析参数,会比北京时间快八小时. 当时用 / 拼接年月日时会使用北京的时区去解析参数,取到的是北 ...
 - 第一篇 HTML 认识HTML
			
认识HTML 学习一门语言,我们要先了解它,可以不用太资深,但要做到别人问,你能回答得出来! 注:推荐大家去网址:www.w3school.com.cn 前端学习手册(免费的) HTML(超文本标记语 ...
 - TVM安装
			
因为现在NNVM的代码都转移到了TVM中,NNVM代码也不再进行更新,因此选择安装的是TVM. git clone --recursive https://github.com/dmlc/tvm su ...