CF 349div2 C
上来题意杀。。好好学英语。。要求连续两个后缀不能相等。
考虑记忆化搜索。。其实也算不上记忆化?
就是设立一个vis[maxn][3][3]来进行剪枝,后两位分别表示要取多少和以前取了多少。。
这样就不会有重复的了。。也避免了test42那样的。。abcdezzzzzzzz。。。
#include <iostream>
#include <set>
using namespace std;
string ss;
const int maxn=100005;
int vis[maxn][3][3];
set<string> s;
void dfs(int x,int y,int last){
if(x-y<5)
return;
vis[x][y][last]=1;
s.insert(ss.substr(x-y,y));
if(ss.substr(x-y,y)==ss.substr(x,last)){
return;
}
if(vis[x-y][2][y]==0)
dfs(x-y,2,y);
if(vis[x-y][3][y]==0)
dfs(x-y,3,y);
}
int main()
{
cin>>ss;
dfs(ss.size(),2,0);
dfs(ss.size(),3,0);
cout<<s.size()<<endl;
for(set<string>::iterator it=s.begin();it!=s.end();it++)
cout<<*it<<endl;
return 0;
}