给出两个字符串,询问有多少种反转方法可以使字符串1变成字符串2。

如果两个串相同,就用马拉车算法找回文串的数量~

如果两个串不同,从前往后找第一个不同的位置l,从后往前找第二个不同的位置r,反转l和r,判断是否成功~

如果不成功,记为0

如果成功,以l和r为起点判断是否能反转,记录次数

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+;
typedef long long ll;
char s1[maxn];
char s2[maxn];
char s[maxn*];
int len[maxn*];
int init(char *str){
int n=strlen(str);
for(int i=,j=;i<=*n;j++,i+=){
s[i]='#';
s[i+]=str[j];
}
s[]='$';
s[*n+]='#';
s[*n+]='@';
s[*n+]='\n';
return *n+;
} void manacher(int n){
int mx=,p=;
for(int i=;i<=n;i++){
if(mx>i) len[i]=min(mx-i,len[*p-i]);
else len[i]=;
while(s[i-len[i]]==s[i+len[i]]) len[i]++;
if(len[i]+i>mx) mx=len[i]+i,p=i;
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%s",s1);
scanf("%s",s2);
int Len=strlen(s1),l=-,r=Len;
for(int i=;i<Len;i++){
if(s1[i]!=s2[i]){
l=i;break;
}
}
for(int i=Len-;i>=;i--){
if(s1[i]!=s2[i]){
r=i;break;
}
}
if(l==-){
ll ans=;
int n=init(s1);
manacher(n);
for (int i=;i<=n;i++) ans+=len[i]/;
printf("%lld\n",ans);
continue;
}
else{
int tmp=;
for(int i=l;i<=r;i++){
if(s1[i]!=s2[l+r-i]){
tmp=;
break;
}
}
if(tmp==){
printf("0\n");
continue;
}
else{
ll ans=;l--;r++;
while (l>=&&r<Len&&s1[l]==s2[r]&&s1[r]==s2[l]){
l--;r++;ans++;
}
printf("%lld\n",ans);
}
}
}
return ;
}

ZOJ4110 Strings in the Pocket(2019浙江省赛)的更多相关文章

  1. ZOJ4104 Sequence in the Pocket(2019浙江省赛)

    思维~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int N; int main ( ...

  2. 2019浙江省赛 Strings in the Pocket【manacher】

    Strings in the Pocket 题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个字符 ...

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

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a ...

  4. ZOJ4102 Array in the Pocket(2019浙江省赛)

    贪心~ #include<bits/stdc++.h> using namespace std; ; int a[maxn]; int b[maxn]; int vis[maxn]; se ...

  5. 2019浙江省赛B zoj4101 Element Swapping(推公式)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6003 题意 \(数组a通过交换一对数字,得到了b数组,给出x=\sum^n_{ ...

  6. zoj4110 Strings in the Pocket(manacher)

    传送:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意:给定两个串$S$和$T$,可以翻转$S$串中的任意一个子段, ...

  7. ZOJ4109 Welcome Party(2019浙江省赛)

    并查集算连通块的数量,集合的个数就是必然不开心的人数,再跑bfs,用优先队列维护~ #include<bits/stdc++.h> using namespace std; ; vecto ...

  8. ZOJ4103 Traveler(2019浙江省赛)

    构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...

  9. hdu6578 2019湖南省赛D题Modulo Nine 经典dp

    目录 题目 解析 AC_Code @ 题目 第一题题意是一共有{0,1,2,3}四种数字供选择,问有多少个长度为n的序列满足所有m个条件,每个条件是说区间[L,R]内必须有恰好x个不同的数字. 第二题 ...

随机推荐

  1. &nbsp;&laquo;&raquo;&lt;&gt;

     空格   «双小于 »双大于 <小于 >大于

  2. Go之第三方库ini

    文章转自 快速开始 my.ini # possible values : production, development app_mode = development [paths] # Path t ...

  3. RHEL7忘记密码:修改root密码

    博客链接:http://blog.csdn.net/derkampf/article/details/54346516 问题描述:日常工作和使用红帽子7系统时,容易发生忘记密码(root)这种尴尬的情 ...

  4. drc实现

    原理参考之前转载的matlab上关于DRC的描述. 目前主要实现了compressor和expander. compressor: Limit: expander: 实现代码: #include< ...

  5. 结合webpack使用vue-router和它的子路由,即路由嵌套

    在上一个项目的基础上进行的,所以基本的配置在这里就不赘述了. 一.结合webpack使用vue-router 1.新建组件.vue文件 2.启用路由 安装插件cnpm i vue-router -S ...

  6. code ELIFECYCLE 报错处理

    npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! m-kbs-vip@1.2.12 toserver: `tua -p toserver`npm ERR ...

  7. Linux netstat命令详解(检验本机各端口的网络连接情况)

    netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...

  8. 特征值 特征向量 正交分解 PCA

    无意间想到的,有时间会补充内容. 还记得学线性代数时计算矩阵的特征值和特征向量,然后这个矩阵就可以用这个特征值和特征向量表示. 这样就可以理解成矩阵其实是多个向量拼在一起的,这样就可以将矩阵和向量建立 ...

  9. Java面向对象编程 -6.6

    数组倒序 做法一:定义一个新的数组而后按照逆序的方式保存 public static void main(String[] args) { int arr[] = new int[] {1,2,3,4 ...

  10. linux shell seq命令详解

    seq: squeue  是一个序列的缩写,主要用来输出序列化的东西 seq常见命令参数 用法:seq [选项]... 尾数 或:seq [选项]... 首数 尾数 或:seq [选项]... 首数 ...