首页 > 其他分享 >字符串问题

字符串问题

时间:2023-05-27 15:11:53浏览次数:32  
标签:abb tem abba int 问题 字符串 奇怪

给定一个有小写字母构成的字符串S。定义F(S)表示本质不同的连续子串的集合,如F("abba") = { "a","b","ab","ba","bb","abb","bba","abba" }。

定义G(S)表示本质不同的非连续子串集合。如G("abba") = { "a","b","ab","ba","bb","abb","bba","abba" ,"aa","aba"}=F(S)∪ { "aa","aba" }。显然,F(S)是G(S)的子集。

但是对于有些字符串很奇怪,它的F(S)=G(S),例如S="abb",因为F(S)=G(S)={ "a","b","ab","bb","abb" },我们称这样的字符串为奇怪字符串。

现在L给你一个字符串S,请你求出F(S)中有多少个元素是奇怪字符串。


首先奇怪字符串不可能存在不相邻的相同字符,接下来在此基础上推出奇怪字符串不可能存在大于两种字符。

对于只有一种字符的奇怪字符串直接取最大值计数即可,有两种的需要特殊处理,看代码画图自己推吧(

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
string s;
vector<pair<ll,int> > vec;
vector<pair<ll,ll> > pl[26][26];
ll si[26];
pair<ll,ll> tem[N];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int nn;
    cin>>s;
    nn=s.length();
    for(int i=0;i<nn;i++)
    {
        if(!i||s[i]!=s[i-1])
        {
            if(i)    si[s[i-1]-'a']=max(si[s[i-1]-'a'],vec.back().first);
            vec.push_back({1,s[i]-'a'});
        }
        else    ++vec.back().first;
    }
    si[s[nn-1]-'a']=max(si[s[nn-1]-'a'],vec.back().first);
    ll ans=0;
    int n2=vec.size();
    for(int i=0;i<26;i++)    ans+=si[i];
    for(int i=1;i<n2;i++)    pl[vec[i-1].second][vec[i].second].push_back({vec[i-1].first,vec[i].first});
    for(int i=0;i<26;i++)
        for(int j=0;j<26;j++)
            if(!pl[i][j].empty())
            {
                int nt=pl[i][j].size();
                for(int e=0;e<nt;e++)
                {
                    tem[e].first=pl[i][j][e].first;
                    tem[e].second=pl[i][j][e].second;
                }
                sort(tem,tem+nt,greater<pair<ll,ll> >());
                ll maxh=0;
                for(int e=0;e<nt;e++)
                {
                    if(!e)
                    {
                        ans+=tem[e].first*tem[e].second;
                        maxh=tem[e].second;
                    }
                    else if(tem[e].second>maxh)
                    {
                        ans+=tem[e].first*(tem[e].second-maxh);
                        maxh=tem[e].second;
                    }
                }
            }
    cout<<ans;
    return 0;
}

 

标签:abb,tem,abba,int,问题,字符串,奇怪
From: https://www.cnblogs.com/eggome/p/17436770.html

相关文章

  • 一个mysql的group_concat导致的问题
    好久都没有写点东西了,是时候有点写东西的必要了。去年下年底离职了,躺了几个月,最近又兜兜转转换了一家公司继续当牛马了,前段时间八股文背了好多,难受呀,不过我也趁着前段时间自己也整理了属于我自己的八股文,有好几万字吧,哈哈哈,以后就不用到处去找八股文了。说回正题,这......
  • 使用SpringMVC 拦截器导致出现@CrossOrigin失效问题解决办法
    非简单请求会发起一个OPTIONS方法的预检请求,这个请求会被拦截器拦截,但是服务器没有给浏览器返回必要的跨域指示信息(比如:“Access-Control-Allow-Origin”----允许哪些请求访问),浏览器没收到指示信息,就认为服务器不允许跨域请求,就会报错。所以需要在拦截器拦截OPTIONS方法的预......
  • 正点原子imx6ull中sudo命令失效问题
    问题出现事情的起因是这样的,我的imx6ull的板子很久没用了,这次重新上电之后,我习惯性的敲了一个sudo随后就发现报错sudo:errorin/etc/sudo.conf,line0whileloadingplugin`sudoers_policy'sudo:/usr/libexec/sudo/sudoers.somustbeownedbyuid0sudo:fatalerror,un......
  • ajax乱码问题和异步同步问题
    1. 测试内容: 201.1 发送ajax get请求    发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.2 发送ajax post请求    - 发送数据到服务器,服务器获取的数据是否乱码?    - 服务器响应给前端的中文,会不会乱码?1.3 包括还要......
  • 使用static_cast进行父类指针转子类指针可能出现的问题
    使用static_cast进行父类指针向子类指针的转换,可能会出现以下问题:如果转换的父类指针并不是指向真正的子类对象,而是指向另一个父类对象,那么转换后的子类指针将指向无效的内存地址,可能导致程序崩溃。如果子类对象中有虚函数或虚继承,static_cast可能会失效,因为它只进行编......
  • 关于oracleJdk连接maven产生ssl验证问题
    问题:failedtotransferfromhttps://repo.maven.apache.org/maven2/duringapreviousattempt这是因为oraclejdk1.8存在ssl验证问题添加以下信息到idea的maven当中即可-Dmaven.wagon.http.ssl.insecure=true-Dmaven.wagon.http.ssl.allowall=true-Dmaven.wagon......
  • Python_手动下载Chrome驱动找不到对应版本,尝试pip自动下载对应版本的驱动,问题解决
    pipinstallwebdriver-manager 验证是否成功代码如下:fromseleniumimportwebdriverdriver=webdriver.Chrome()url='https://www.csdn.net/'driver.get(url)driver.maximize_window()验证成功......
  • 字符串常用函数
    count():返回某个字符在字符串中出现的次数replace():替换title():将字符串每个单词首字母转为大写lower():将字符串中大写转小写upper():将字符串中小写转大写字符串序列.split(分割字符,分割次数) # 返回数据个数为分割次数+1:返回的是一个列表哈切片语法:序列[开始位置下标:......
  • 所有背包问题模板
    01背包问题:无优化for(inti=1;i<=n;i++){for(intc=0;c<=m;c++){f[i][c]=f[i-1][c];if(c>=w[i])f[i][c]=max(f[i][c],f[i-1][c-w[i]]+v[i]);}}一维数组优化:for(inti=1;i<=n;i++){for(intc=m;c>=0;c--){......
  • 【模板】01背包问题
    一个在旅途中的长者有一个最多能用\(M\)公斤的背包,现在有\(n\)件物品,它们的重量分别是\(W1,W2,...,Wn\),它们的价值分别为\(C1,C2,...,Cn\).求旅行者能获得最大总价值。输入第1行:两个整数,\(M\)(背包容量,\(M\le200\))和\(n\)(物品数量,\(n\le30\));第\(2\)至\(n+1\)行:每行两个整数\(......