给你一个串,问你都哪些位置即使前缀又是后缀。
思路:
可以用KMP来做,尝试过很多种方法,想把两个串接起来然后..失败,后来又想可以倒着匹配,就是把整个串倒过来..失败,说下第三种也是成功的方法,就是正常匹配,然后找到最后一个的next,如果是0,那么就不用找了,否则里面的数值是答案,然后再找next对应的那个数值,一直找到0,最后记得把总长度加上,正确性可以这么想,从后往前找保证是后缀,不是0保证当前失配不用返回起点也就是当前是当前是某个和前缀相同但不是前缀的字符串的最后一个字母。
#include<stdio.h>
#include<string.h>
char str[400005];
int next[400005];
int ans[400005];
void Get_Next(int m)
{
int j = 0 ,k = -1;
next[0] = -1;
while(j < m)
{
if(k == -1 || str[j] == str[k])
next[++j] = ++k;
else k = next[k];
}
return ;
}
int main ()
{
int m ,i;
while(~scanf("%s" ,str))
{
m = strlen(str);
Get_Next(m);
int id = m;
i = 0;
while(next[id])
{
ans[++i] = next[id];
id = next[id];
}
ans[0] = m;
m = i;
for(i = m ;i >= 0 ;i --)
{
if(!i) printf("%d
" ,ans[i]);
else printf("%d " ,ans[i]);
}
}
return 0;
}