-
L - Substrings
HDU - 1238
-
-
substr
-
(C++语言函数)
- 编辑
- substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
- 题意 :
- 查找最长公共子串 ,可以从最小子串找起 ,并且可以查找逆序是否是别的串的子串。
- 注意最后若找不到输出0。
- STL:
-
#include<bits/stdc++.h> using namespace std; #define maxn 155 string str[maxn],son,s1,s2; int len,t,n,mini,k; int main() { cin>>t; while(t--) { mini=555; bool flag; cin>>n; for(int i=0; i<n; i++) { cin>>str[i]; len=str[i].size(); if(len<mini) { mini=len; son=str[i]; } } for(int i=mini; i>0; i--)//i是长度 { flag=1; for(int j=0; j<mini+1-i; j++) //j是起始位置,起始位置得保证后面的字符够取得才可以 { s1=son.substr(j,i); s2=s1; reverse(s2.begin(),s2.end()); for( k=0; k<n; k++) if(str[k].find(s1)==-1&&str[k].find(s2)==-1) break; if(k==n) break; } if(k==n) { cout<<s1.size()<<endl; flag=0; break; } } if(flag) cout<<0<<endl; } return 0; }
- KMP:
-
#include<bits/stdc++.h> using namespace std; #define maxn 155 string str[maxn],son,s[5]; int len,t,n,mini,k,nxt[5][maxn]; void getnext(int lengt,int cnt) { int i=0,j=-1; nxt[cnt][0]=-1; while(i<lengt) { if(j==-1||s[cnt][i]==s[cnt][j]) { i++; j++; nxt[cnt][i]=j; } else j=nxt[cnt][j]; } } int kmp(int cnt,int indx) { int i=0,j=0; while(i<str[cnt].size()) { if(j==-1||str[cnt][i]==s[indx][j]) { i++; j++; } else j=nxt[indx][j]; if(j==s[indx].size()) return 1; } return -1; } int main() { cin>>t; while(t--) { mini=555; bool flag; cin>>n; for(int i=0; i<n; i++) { cin>>str[i]; len=str[i].size(); if(len<mini) { mini=len; son=str[i]; } } for(int i=mini; i>0; i--)//i是长度 { flag=1; for(int j=0; j<mini+1-i; j++) //j是起始位置,起始位置得保证后面的字符够取得才可以 { s[1]=son.substr(j,i); s[2]=s[1]; reverse(s[2].begin(),s[2].end()); len=s[1].size(); getnext(len,1); getnext(len,2); for( k=0; k<n; k++) if(kmp(k,1)==-1&&kmp(k,2)==-1) break; if(k==n) break; } if(k==n) { cout<<s[1].size()<<endl; flag=0; break; } } if(flag) cout<<0<<endl; } return 0; }
L - Substrings -KMP-substr-find
最新推荐文章于 2018-11-09 11:23:32 发布