2019浙江省赛K zoj4110 Strings in the Pocket(manachar)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012

题意

给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a串等于b串

题解

  • 沙比提,比赛时想了想两个串相等就用马拉车求回文子串个数,觉得两个串不相等情况很复杂就没想下去了,其实两个串不相等的情况更好处理
  • 两个串不一样的话,一定需要翻转第一个和最后一个不相等的位置(关键),判一下中间是不是回文串,然后维护一下两边即可
  • 特判只有一个字符不相等的时候

代码

#include<bits/stdc++.h>
#define MAXN 2000005
#define ll long long
using namespace std;
char a[MAXN],b[MAXN];
int n,odd[MAXN],eve[MAXN],T;
ll manachar(){
    int l=0,r=0,x;
    ll ans=0;
    for(int i=1;i<=n;i++){
        if(i>r)x=1;
        else x=min(odd[l+r-i],r-i);
        while(i-x>=1&&i+x<=n&&a[i-x]==a[i+x])x++;
        odd[i]=x;
        ans+=x;
        if(i+x-1>r){r=i+x-1;l=i-x+1;}
    }
    l=r=0;
    for(int i=1;i<=n;i++){
        if(i>r)x=0;
        else x=min(eve[l+r-i+1],r-i+1);
        while(i-x-1>=1&&i+x<=n&&a[i-x-1]==a[i+x])x++;
        eve[i]=x;
        ans+=x;
        if(i+x>=r){l=i-x;r=i+x-1;}
    }
    return ans;
}
int main(){
    cin>>T;
    while(T--){
        scanf("%s",a+1);scanf("%s",b+1);
        n=strlen(a+1);
        int L=1,R=n;
        for(;L<=n;L++)if(a[L]!=b[L])break;
        for(;R>=1;R--)if(a[R]!=b[R])break;
        if(L==R){printf("0\n");continue;}
        else if(L<=n){
            int ans=1;
            for(int i=L;i<=R;i++){
                if(a[i]!=b[L+R-i]){ans=0;break;}
            }
            if(ans){
                L--;R++;
                while(L>=1&&R<=n&&a[L]==b[R]&&a[R]==b[L]){ans++;L--;R++;}
            }
            printf("%d\n",ans);
        }else{
            printf("%lld\n",manachar());
        }
    }
}

原文地址:https://www.cnblogs.com/VIrtu0s0/p/10781700.html

时间: 2024-08-30 17:53:16

2019浙江省赛K zoj4110 Strings in the Pocket(manachar)的相关文章

ZOJ4110 Strings in the Pocket(2019浙江省赛)

给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2. 如果两个串相同,就用马拉车算法找回文串的数量~ 如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r,判断是否成功~ 如果不成功,记为0 如果成功,以l和r为起点判断是否能反转,记录次数 #include<bits/stdc++.h> using namespace std; const int maxn=2e6+100; typedef long long ll; char s1[maxn];

ZOJ 3879 Capture the Flag 15年浙江省赛K题

每年省赛必有的一道模拟题,描述都是非常的长,题目都是蛮好写的... sigh... 比赛的时候没有写出这道题目 :( 题意:首先输入4个数,n,q,p,c代表有n个队伍,q个服务器,每支队伍的初始分数p, 还有c次操作对于每次操作,首先输入一个k,代表k次攻击每次攻击有三个数,a,b,c, 代表a通过c服务器成功的攻击了b对于每次成功的攻击,b会失去n-1分, 这n-1分会平分给通过同一服务器攻击b的几支队伍然后是q行,每行n个数, 分别代表1~n是否成功维护了,1为成功,0为不成功不成功的队伍

2019山东省赛K - Happy Equation ZOJ - 4123 题解

题意: 一个数论题,要求满足如下等式的x有多少个. 思路: 当时比赛是,队伍看到这个题,也没有做太多的思考,就是无从下手,几乎放弃.但是看到学校另外两支队伍都过了这个题,感觉自己还是好菜. 打表可以发现,当a为奇数的时候答案为1.当a为偶数的时候,x一定也是偶数,这个还是比较明显的. 对左边进行推导,因为a为偶数,设a=2*t,所以a^x=2^x*t^x,所以当x大于p时,这个求余之后一定为0.由于p很小,可以直接暴力求解,所以对于右边直接考虑x^a求余之后为0的x的情况.由于x为偶数.我们再次

2019湖南省赛 K 双向链表练习题(list)

https://ac.nowcoder.com/acm/contest/1099/K 这题大概只要会list就会做吧...我是真的dd 1 #define bug(x) cout<<#x<<" is "<<x<<endl 2 #define IO std::ios::sync_with_stdio(0) 3 #include <bits/stdc++.h> 4 #define iter ::iterator 5 #define

zoj4110 Strings in the Pocket(manacher)

传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段,得到$T$.问,可以翻转的方案书有多少? 数据范围:多组数据.$1\leq|S|\leq2\times10^5$,$\sum|S|\leq2\times10^7$. 分析:很明显需要分类讨论$S$与$T$比较的各种情况. 首先需要判断$S$串从左和从右找到与$T$开始不同的位置. $S$不可以翻转成

2017浙江省赛 D - Let&#39;s Chat ZOJ - 3961

地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3961 题目: ACM (ACMers' Chatting Messenger) is a famous instant messaging software developed by Marjar Technology Company. To attract more users, Edward, the boss of Marjar Company, has re

第14届浙江省赛--Let&#39;s Chat

Let's Chat Time Limit: 1 Second      Memory Limit: 65536 KB ACM (ACMers' Chatting Messenger) is a famous instant messaging software developed by Marjar Technology Company. To attract more users, Edward, the boss of Marjar Company, has recently added

2019模拟赛09场解题报告

目录 2019模拟赛09场解题报告 目录la~~ 题一:瞬间移动 题二:食物订购 题三:马蹄印 题四:景观美化 2019模拟赛09场解题报告 标签(空格分隔): 解题报告 Forever_chen 2019.8.20 目录la~~ 题一:瞬间移动 [题面] 有一天,暮光闪闪突然对如何将一个整数序列a1,a2,...,an排序为一个不下降序列起了兴趣.身为一只年轻独角兽的她,只能进行一种叫做"单元转换"(unit shift)的操作.换句话说,她可以将序列的最后一个元素移动到它的起始位置

HDU6706 CCPC 2019网络赛 huntian oy 推式子+杜教筛

CCPC 2019 网络赛 HDU 6706 huntian oy 标签 奇奇怪怪的数论结论 杜教筛 前言 我的csdn和博客园是同步的,欢迎来访danzh-博客园~ 简明题意 给定n,a,b,求: \[\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\%(10^9+7)\] 思路 首先有一个结论: \[gcd(i^a-j^a,i^b-j^b)=i^{gcd(a,b)}-j^{gcd(a,b)}\] 上面的结论对于i,j互质是成立的