题意:UVU形式的串的个数,V的长度规定,U要一样,位置不同即为不同字串

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=&problem=1770

题解:一开始理解错题意,以为是abcxxxcba(xxx为v),开心地打了后缀数组后发现哎样例不对丫。。

UVA的意思是abcxxxabc(xxx为v)。

类似poj3693,我们暴力枚举U的长度L,对原串按U的长度进行分块。

对于当前分块出来的点x,y=x+u+v是UVU中后一个U中的对应点。

然后往前往后匹配:这里其实是应该用后缀数组+rmq匹配的,然而我用for循环直接暴 过了。。

然后我们得到了两条串的往前往后的lcp1和lcp2。(往前往后都只用匹配L就够了,不然会在下一个分割点找到)

ans+=lcp1+lcp2-L

减L的原因:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; typedef long long LL;
const int N=;
int sl,cl,v;
char c[N]; int main()
{
freopen("a.in","r",stdin);
freopen("me.out","w",stdout);
int T,cas=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&v);
scanf("%s",c+);
cl=sl=strlen(c+);
int x,y,now;
LL t0,t1,ans=;
for(int L=;L<=cl;L++)
{
for(int i=;(i*L)<=cl;i++)
{
x=i*L+,y=((i+)*L)+v+;
if(y>cl) break;
t0=t1=;
for(int j=;j<L;j++)
{
if(c[x-j]!=c[y-j] || x-j<) break;
t0++;
}
for(int j=;j<L;j++)
{
if(c[x+j]!=c[y+j] || y+j>cl) break;
t1++;
}
if(t0 && t1 && t0+t1>=L) ans+=t1+t0-L;
}
}
printf("Case %d: %lld\n",++cas,ans);
}
return ;
}

最新文章

  1. windows 2008 server NTP Server
  2. 邮箱验证 各种邮箱的smtp
  3. sof文件和NIOS II的软件(elf)合并为jic文件以使用Quartus Programmer烧写
  4. 初学web开发——怎么解决无法找到路径的问题
  5. tz2txt的安装与使用
  6. FAQ: Machine Learning: What and How
  7. mysql四种事务隔离级的说明
  8. MicroSD卡(TF卡)SPI模式实现方法
  9. Mac OS 10.8 中的 OpenCV 开发环境设置
  10. 李洪强iOS开发之【零基础学习iOS开发【01-前言】03-前景和难易度分析
  11. FZU 1686 神龙的难题 (DLX)
  12. C# - List操作- 去掉重复
  13. 整数v,从高位到低位,取c位数,得到最大数 (其中:v&gt;=10^c)
  14. MySQL安全问题
  15. 【LeetCode题意分析&amp;解答】43. Multiply Strings
  16. css3 动画运动路径
  17. OSS.Social微信项目标准库介绍
  18. Smarty基础用法
  19. js查找、自组织数据
  20. Harbor作为Docker的镜像中心

热门文章

  1. 【问题记录】Linux Python等交互式输入回退键出现 ^H^H
  2. Linux的系统安全设置Shell脚本
  3. ubuntu 14.04安装nginx+php
  4. FJOI 2019 游记
  5. Android 上能提高学习工作效率的应用
  6. 国际电话区号SQL
  7. 问题 C: Goldbach&#39;s Conjecture
  8. AGV小车典型设计算法及应用
  9. mongodb数据库高级操作
  10. SpringBoot 中使用shiro注解使之生效