三个朋友
时间:2019-10-03
本文章向大家介绍三个朋友,主要包括三个朋友使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
给出一个字符串U,求满足条件的字符串S使其复制一遍再插入一个字符后的字符串为U。
思路
由于插入过一个字符,所以我们可以进行一次扫描,每次扫描时将这个字符去掉,把去掉后字符串分成长度相等的两段,再比较这两段是否完全相同即可。如果暴力枚举看是否相同肯定会T飞,我们考虑使用字符串Hash,求出两段的Hash值比较是否相等即可。需要注意的有两点:①把字符串取出时注意对进制转换;②有可能会存在多个相等的S,它们不算重复。
代码
#include <bits/stdc++.h> using namespace std; typedef unsigned long long ull; const ull p=47; char s[2000005]; ull sum[2000005],power[2000005]; int main() { // freopen("aa.txt","r",stdin); int n; scanf("%d",&n); scanf(" %s",s+1); if(n%2==0){printf("NOT POSSIBLE");return 0;} int len=(n-1)/2; power[0]=1; for(int i=1;i<=n;i++) { sum[i]=sum[i-1]*p+s[i]-'A'; power[i]=power[i-1]*p; } ull ans=0,k=0,l=0; bool f=1; // cout<<sum[4]<<endl; for(int i=1;i<=n;i++) { if(i<=len+1) { ull s1=sum[i-1]*power[len-i+1]+(sum[len+1]-sum[i]*power[len-i+1]); ull s2=sum[n]-sum[n-len]*power[len]; if(s1==s2) { ans++; if(ans==1)k=s1,l=i; else if(k!=s1)f=0; } // cout<<i<<' '<<s1<<' '<<s2<<' '<<ans<<endl; } else { ull s1=sum[len]; ull s2=(sum[i-1]-sum[len]*power[i-len-1])*power[len*2-i+1]+sum[n]-sum[i]*power[n-i]; if(s1==s2) { ans++; if(ans==1)k=s1,l=i; else if(k!=s1)f=0; } // cout<<i<<' '<<s1<<' '<<s2<<' '<<ans<<endl; } } // cout<<ans<<' '<<l<<endl; if(ans==1||(ans>1&&f)) { if(l<=len+1) for(int i=n-len+1;i<=n;i++) putchar(s[i]); else for(int i=1;i<=len;i++) putchar(s[i]); } else if(ans==0) printf("NOT POSSIBLE"); else printf("NOT UNIQUE"); return 0; }
原文地址:https://www.cnblogs.com/fangbozhen/p/11619392.html
- 前端三大框架vue,angular,react大杂烩
- CaseStudy(showcase)布局篇-如何做一个自适应窗口大小的布局
- WCF后续之旅(2): 如何对Channel Layer进行扩展——创建自定义Channel
- [Silverlight动画]转向行为 - 到达行为
- Asp.Net统一前后端提示信息方案
- 人工智能:未来决策制定的机遇与影响
- CaseStudy(showcase)界面篇-导出xaml以及放入Blend的技巧
- [Silverlight动画]转向行为 - 避开行为
- CaseStudy(showcase)界面篇-desing设计界面
- [Silverlight动画]转向行为 - 寻找行为
- 【数字货币】数字黄金
- [Silverlight动画]转向行为 - 转向机车
- [Silverlight动画]转向行为 - 机车
- 微信、小游戏与未来
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LeetCode33|寻找重复数
- LeetCode32|前k个高频元素
- LeetCode31|打印从1到最大的n位数
- LeetCode30|翻转单词顺序
- LeetCode28|最后一个单词的长度
- VS2015创建UWP报“vstemplate文件引用的向导类”错误
- 政采云趣味题
- LeetCode40|有序数组中的单一元素
- 搭建简易的物联网服务端和客户端-Cortana控制(十七)
- LeetCode39|找树左下角的值
- LeetCode38|根据字符出现频率排序
- 搭建简易的物联网服务端和客户端-Nodejs_PM2(十八)
- spring boot 项目中自动执行 sql 语句
- 搭建简易的物联网服务端和客户端-邮件通知(十九)
- LeetCode37|两颗二叉搜索树中所有元素