1818: squee_spoon and his Cube VI
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 41 Solved: 13
Submit Status Web Board
Description
市面上最常见的魔方,是三阶魔方,英文名为Rubik's Cube,以魔方的发明者鲁比克教授的名字命名。另外,二阶魔方叫Pocket Cube,它只有2*2*2个角块,通常也就比较小;四阶魔方叫Revenge Cube,这是因为就算你好不容易复原了三阶魔方,四阶魔方也会向你“复仇”;而五阶魔方叫Professor Cube,人们认为只有专家才能够复原这么复杂的魔方。
作为ACM(A Cube Master),squee_spoon准备为九阶正十二面体魔方命名,此时他的脑中浮现出一个长长的字符串S,似乎可以作为魔方的英文名。但是问题没有那么简单,squee_spoon有n个不喜欢的短字符串a1~an,所以squee_spoon希望将九阶正十二面体魔方命名为S的最长子串T,在这个子串中,不能包含a1~an,即a1~an均不是T的子串。
Input
多组数据。
第一行,字符串S,长度不会超过10^5。
第二行,一个整数n,1<=n<=10。
接下来的n行,n个字符串a1~an,ai的长度不会超过10。
Output
对于每组数据,输出两个整数,分别是T的长度及其在原串S中的起始下标(下标从0开始,如果存在多解,输出最小的起始下标)。
Sample Input
orz_zzuspy
2
orz
us
YM_2030xxj
3
_20
03
M_
Sample Output
6 1
5 5
HINT
Source
郑大第九届校赛正式赛
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
char str[100010];
char s[15][15];
int main()
{int n,i,j,k;while(scanf("%s",str)!=EOF){scanf("%d",&n);int len=strlen(str);for(i=0;i<n;++i){scanf("%s",s[i]);}int num=0,cnt;int lans=-1,qans=0;for(i=0;i<len;++i){for(j=0;j<n;++j){if(str[i]==s[j][0]){int l=strlen(s[j]);for(k=0;k<l;++k){if(str[i+k]!=s[j][k])break;}if(k>=l){cnt=i+l-num-1;if(cnt>lans){lans=cnt;qans=num;}num=i+1;}}}}cnt=len-num;if(cnt>lans){lans=cnt;qans=num;}printf("%d %d\n",lans,qans);}return 0;
}