题意:问第二行的串能不能恰好分割成几个串,使得这几个串都是第一行串的前缀。如果是,输出No, 并输出这几个串,否则输出Yes。

这题是Special Judge,把两个串连接起来,中间用一个未出现过的字符分隔开。

从新串串尾开始,每次向前移动一个最大前缀的长度。如果期间遇到nextval值为0的点(即没有公共前缀),则肯定不行。

记录分割点位置,输出结果。

#include <cstdio>
#include <cstring>
#include <cstdlib> const int MAXN = ; char str[MAXN << ];
char tmp[MAXN];
int nextval[MAXN << ];
int strL, len;
bool flag[MAXN]; void getNext(char s[],int next[])
{
int length=len;
int i=,j=-;
next[]=-;
while(i<length)
{
if(j==-||s[i]==s[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
return;
} int main()
{
while ( scanf( "%s", str ) == )
{
strL = strlen(str);
scanf( "%s", tmp );
str[strL] = '$';
strcpy( &str[strL+], tmp );
len = strlen(str);
getNext( str, nextval ); //puts(str); memset( flag, false, sizeof(flag) );
bool ok = false;
for ( int i = len; i > strL+; )
{
int tp = nextval[i];
if ( tp == ) ok = true;
if ( i-(strL+)- >= ) flag[i-(strL+)-] = true;
//printf( "i=%d tp=%d\n", i, tp );
if ( tp > ) i -= tp;
else --i;
} if ( ok ) puts("Yes");
else
{
puts("No");
for ( int i = ; i < len-strL-; ++i )
{
putchar( tmp[i] );
if ( i != len-strL- && flag[i] ) putchar(' ');
}
puts("");
}
}
return ;
}

最新文章

  1. makefile小例子
  2. 边表+SPFA
  3. [Aaronyang] 写给自己的WPF4.5 失传的第一本古老秘籍[多扩展显示器编程]
  4. HDU 4925 Apple Tree(模拟题)
  5. cookie 使用笔记
  6. [你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题
  7. Unity之屏幕画线
  8. HDU 1269 迷宫城堡 【强联通分量(模版题)】
  9. 解决Android AVD启动报错问题
  10. 【递推+矩阵快速幂】【HDU2604】【Queuing】
  11. uva 11077 置换
  12. angular.js的ui-router总结
  13. Spring Cloud Context模块
  14. JavaScript获取键盘事件
  15. java中JDBC连接Oracle数据库
  16. 百度地图自定义icon,定位偏移问题
  17. 微信Access Token 缓存方法
  18. WIN10系统如何取消右下角的通知菜单,通知图标
  19. KEIL C51程序中如何嵌入汇编
  20. laravel运行慢是怎么回事?

热门文章

  1. tensorflow与android编译
  2. Linux(三) - 文件操作相关命令
  3. office2010激活
  4. 第26章 FMC—扩展外部SDRAM—零死角玩转STM32-F429系列
  5. SqlServer和Oracle修改表结构语句
  6. JavaScript中并非一切皆对象
  7. C#+Winform记事本程序
  8. python3 井字棋 GUI - 人机对战、机器对战 (threading、tkinter库)
  9. LVS+Keepalived-DR模式负载均衡高可用集群
  10. python基础之布尔运算、集合