题意:给两个字符串s1,s3。s3能否由s1或者s1的反字符串s2的某些连续的部分构成。例:s1 = “abc” s2 = “cbaabc” “cbaabc” = “cba” + “abc”.
思路:暴力就好,首先看”c”能不能在s1或者s2中找到,然后看”cb”能不能在s1或者s2中找到,如果能找到,继续这个过程。如果不能找到,”c”就是一个结果,”b”就是下一个字符串的第一个字符。
http://codeforces.com/contest/615/problem/C
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = (a) ; i <= (b) ; i ++)
#define rrep(i,a,b) for(int i = (b) ; i >= (a) ; i --)
#define repS(it,p) for(auto it = p.begin() ; it != p.end() ; it ++)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m,k;
int fx[] = {0,1,-1,0,0};
int fy[] = {0,0,0,-1,1};
char s1[2105],s2[2105],s3[2105];
char tmp[2105];
int lens ;
void get_s2() {
rep(i,0,lens-1) {
s2[lens-i-1] = s1[i];
}
s2[lens] = 0;
}
void input() {
}
int pos1 = 0 , pos2 = 0;
int prepos1 , prepos2;
int par[2105][2];
int pos = 0;
void get_pos() {
prepos1 = pos1 ;
prepos2 = pos2 ;
if(pos > lens) {
pos1 = pos2 = -1;
return ;
}
pos1 = strstr(s1,tmp) - s1;
pos2 = strstr(s2,tmp) - s2;
}
void solve() {
lens = strlen(s1);
get_s2();
int len = strlen(s3);
int tot = 0;
pos1 = -1 ; pos2 = -1;
pos = 0;
int ok = 0;
s3[len] = '#';
rep(i,0,len) {
tmp[pos++] = s3[i];
tmp[pos] = 0;
get_pos();
if(pos1 >= 0 || pos2 >= 0) {
}
else {
++ tot;
if(prepos1 < 0 && prepos2 <0) {
ok = 1;
break;
}
if(prepos1 >= 0) {
par[tot][0] = prepos1 + 1;
par[tot][1] = prepos1 + strlen(tmp) - 1;
}
else {
par[tot][0] = lens - prepos2 ;
par[tot][1] = lens - prepos2 - strlen(tmp) + 2;
}
pos = 0;
tmp[pos++] = s3[i];
tmp[pos] = 0;
get_pos();
}
}
if(!ok) {
printf("%d\n",tot);
rep(i,1,tot) {
printf("%d %d\n",par[i][0],par[i][1]);
}
}
else {
puts("-1");
}
}
int main(void) {
while(~scanf("%s%s",s1,s3)) {
input();
solve();
}
return 0;
}