首页 > 其他分享 >CSP-S 2023消消乐 字符串哈希做法and链表优化dp做法

CSP-S 2023消消乐 字符串哈希做法and链表优化dp做法

时间:2023-12-24 21:49:20浏览次数:27  
标签:int res rep long 链表 tp 哈希 做法 define

做完这题感觉整个人都升华了...

打算说一下两种做法,字符串哈希和dp均可。

dp则需要维护一个前向星去检索出第一个符合要求的位置。

题解明天补,先写高数了。

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
#define pii pair<int,int>
const int N=3e6+5;

char t[N];
int n;
int f[N];
int lst[N];

int32_t main(){
    cin>>n;
    rep(i,1,n) cin>>t[i];
    int ans=0;
    rep(i,1,n){
        for(int j=i-1;j>0;j=lst[j]-1){
            if(t[j]==t[i]){
                lst[i]=j;
                break;
            }
        }
        if(lst[i]) f[i]=f[lst[i]-1]+1;ans+=f[i];
    }
    //rep(i,1,n) cout<<f[i]<<" ";cout<<'\n';
    cout<<ans;
}

 //字符串哈希

#include <bits/stdc++.h>
#define int long long
#define ull unsigned long long
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
using namespace std;
#define pii pair<int,int>
const int N=3e6+5;

char t[N];
int n;
ull p[N];
char st[N];
unordered_map<ull,int> cnt;

int32_t main(){
    //prework
    cin>>n;
    p[0]=1;
    rep(i,1,n){p[i]=p[i-1]*13331;}

    rep(i,1,n) cin>>t[i];
    cnt[0]=1;
    int tp=0;
    ull res=0;
    int ans=0;
    rep(i,1,n){
        if(tp!=0&&st[tp]==t[i]){
            res-=p[tp]*t[i];tp--;
        }else{
            res+=p[++tp]*t[i];st[tp]=t[i];
        }
        ans+=cnt[res];cnt[res]++;
    }
    cout<<ans;
}

 

标签:int,res,rep,long,链表,tp,哈希,做法,define
From: https://www.cnblogs.com/Kopicy/p/17924898.html

相关文章

  • C++简单实现list链表数据结构(一)
    链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接实现的。链表的组成:链表由一系列结点组成结点的组成:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域C++STL中的链表是一个双向循环链表由于链表的存储方式并不是连续的内存空......
  • 142. 环形链表Ⅱ
    给定一个链表的头节点head,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。不允许修改链表。整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。......
  • P6164 后缀平衡树的一种非常规做法
    【模板】后缀平衡树LuoguP6164题目描述给你一个字符串init,要求你支持三个操作:在当前字符串的后面插入若干个字符。在当前字符串的后面删除若干个字符。询问字符串\(s\)在当前字符串中出现了几次(作为连续子串)?你必须在线支持这些操作。Solution此处写一种非常......
  • c语言单链表
    #include<stdio.h>#include<stdlib.h>#defineERROR-1#defineSUCCESS0structlist_node{intdata;structlist_node*next;/*data*/};typedefstructlist_nodelink_list;intlist_get_size(link_list*list){intcount=0;......
  • 力扣234-回文链表
    难度:【简单】第一个想法是用栈,提交代码3次都显示解答错误。原因:第一次是没考虑一个节点的情况;第二次是不应该通过栈剩余元素个数判断单节点情况;第三次是没有考虑奇数个节点的情况。看官方题解,重新思考。用数组最容易解,时空复杂度都是O(n)。刚开始用栈是以为能优化到进阶的O(1)......
  • 链表
    约瑟夫问题(洛谷P1996)题目大意用Markdown写博客一年多了,最开始是用富文本写,后来发现Markdown更适合我,而且CSDN提供了导入导出的功能,图片可以云存储,所以导出了博文在本地也可以直接看,尤其是笔记类型很方便。所以这里总结一下自己常用模板和小伙伴们分享下[这里写一些为啥要整理......
  • 2023.12.20闲话——对埃及分数的另一种做法(?)
    昨天教室里进来一只母猫,还很可爱的,被同学围着叫学姐(埃及分数大家都很了解,是一个迭代加深搜索的经典题。但是我突发奇想想到一个不用搜索(但是枚举)的做法。很容易可以发现右边的式子通分之后的分母一定是式子左边约分后分母的倍数。于是我们可以枚举右边式子通分后的分母,然后选......
  • 【重排链表】双指针+反转链表+合并链表
    leetcode143.重排链表题意:给定一个单链表L的头节点head,单链表L表示为:L0→L1→…→Ln-1→Ln请将其重新排列后变为:L0→Ln→L1→Ln-1→L2→Ln-2→…不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。题解:可以发现重新排列的链......
  • 【环形链表】哈希表HashSet / 双指针
    leetcode142.环形链表II题意:不可更改链表节点,给定链表表头,返回链表在环中的第一个节点,没有返回null题解:哈希表集合遍历一遍链表,哈希表集合维护链表节点,当访问到的当前节点已经在集合中,说明当前节点是所求节点哈希表集合解代码/***Definitionforsingly-linkedlist.......
  • 算法学习Day5 哈希的一天
    Day5哈希的一天ByHQWQF2023/12/13当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。笔记242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例 1:输入:s="anagram",t="nagaram......