这题说的是给了一个字符串当前缀和后缀相同的时候就计算此时的 整个串种拥有这样的子串友多少个,没想到用KMP解 用0开头的那种类型的 KMP 今天刚好也学了一下,因为KMP的作用是找出最长前缀 KMP 后得到最后一个字符串在前缀当中的最长前缀然后即可以知道在这个最长前缀中可能还有比 最 长 前 缀 更 小 的 子 串 然 后 再 以 这  个 子 串 的 next 从最后开始KMP 然后就可以得到了次子串 这样一直下去

#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn = ;
int next[maxn],dp[maxn+],tack[maxn];
char str[maxn];
void getnext(){ int j=;
int Len = strlen(str+);
next[] = next[] = ;
for( int i = ; i <= Len ; i++ )
{
while( j && str[i]!=str[j+] ) j=next[j];
if(str[i]==str[j+]) j++;
next[i] = j;
}
}
int main()
{
while(scanf("%s",str+)==){
fill(dp,dp+maxn,);
getnext();
// int Len= strlen(str);
//for(int i = len-1 ;i < i++ )
int Len = strlen(str+);
for( int i=Len ;i > ; i--)
dp[next[i]]+=dp[i];
int num = ;
int j=next[Len];
while(j){
tack[num++]=j;
j=next[j];
}
printf("%d\n",num+);
for(int i=num-; i >= ; -- i)
printf("%d %d\n",tack[i],dp[tack[i]]);
printf("%d %d\n",Len,);
}
return ;
}

E 这题原来是一个贪心 没想出来 对于每一个位置判断该位置用最小的 然后不断的去扩大他的范围然后 当n+1*n+1 范围内有别的字符存在的时候,或者超出范围 或者 在右上角这个位置可以填写别的字符 时就返回n 否则继续

#include <cstdio>
#include <string.h>
#include <iostream>
using namespace std;
const int maxn = ;
char map[maxn][maxn];
bool in[maxn][maxn];
int N,M;
char tochar(int x,int y){
for( int i='A' ; i <='Z' ; ++i ){
bool falg = true;
if( map[x-][y]==i ) falg = false;
if( map[x][y-]==i )falg =false;
if( map[x][y+]==i ) falg =false;
if( falg ) return i;
}
}
int jud(int x,int y,char &aim){ int num = ;
aim= tochar(x,y);
while(true){
if( x + num > N || y + num > M) return num;
if(in[x][y+num]) return num;
char to=tochar(x,y+num);
if( to != aim) return num;
num++;
}
}
void out(int x,int y,int num ,char t){
for(int i=x; i<x+num; ++i)
for( int j =y ; j< y+num; ++j ){
map[i][j] = t;
in[i][j] =true;
}
}
int main(){ // freopen("out.txt","w",stdout);
memset(in,false,sizeof(in)); memset(map,'a',sizeof(map)); scanf("%d%d",&N,&M); for( int i = ; i <= N ; ++ i)
for( int j = ; j <= M ; ++ j)
if(in[i][j]==false){
char t;
int num= jud(i,j,t);
out(i,j,num,t);
} for( int i= ;i <= N ; ++ i){ for( int j = ;j<=M ; ++ j)
printf("%c",map[i][j]);
printf("\n");
}
return ;
}

最新文章

  1. BPM配置故事之案例13-触发消息通知
  2. 【Win10 应用开发】集成语音命令
  3. hdu-acm steps 免费馅饼
  4. CentOS 伪装安装TSA for DB2
  5. Linux 测试网速
  6. Android开发之onActivityResult()中的resultCode为0,intent为null的解决办法
  7. 俄罗斯方块:Python实现
  8. firebug使用
  9. 使用print2flash开发在线文档
  10. 内置Web Server
  11. LeetCode 136. Single Number (落单的数)
  12. 【原】Java学习笔记004 - 运算符
  13. idea 的一些基本的配置
  14. vue-cli 项目实现路由懒加载
  15. 用Ajax遍历三级下拉框
  16. Windows系统java下载与安装
  17. LeetCode算法题-Valid Anagram(Java实现)
  18. vue打包项目后使用-webkit-line-clamp: 2;这个属性不生效?
  19. Confluence 6 导入一个 Confluence 站点
  20. HDU 3667.Transportation 最小费用流

热门文章

  1. Sublime PlantUML环境配置
  2. linux启动程序和关闭程序脚本
  3. spring task的定时任务突然断了
  4. Flask详解
  5. 7.22 python面试题
  6. TFS二次开发系列索引
  7. Nginx防止恶意域名解析
  8. poj1611 The suspects【并查集】
  9. opencv3在CMakeLists.txt中的调用问题
  10. Python:列表生成式